2015-12-26 3 views
0

У меня есть запрос lucene, который выполняет поиск по полному тексту в индексированных полях. Я хочу добавить диапазон дат к этому запросу.Добавление диапазона дат в поисковый запрос lucene

Я нашел этот вопрос и использовал там ответ: How to search between dates (Hibernate Search)?

Но когда я хочу, чтобы получить данные между датами она ничего не возвращает. Я использую MSSQL db, а тип поля даты - дата и время. Но это аннотируется как @Temporal(TemporalType.TIMESTAMP) в классе сущностей.

Вот моя сущность класс:

... 
@Entity 
@Indexed 
@FullTextFilterDef(name = "tarihAraligi", impl = Satislar.class) 
@Table(name = "satislar") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Satislar.findAll", query = "SELECT s FROM Satislar s"), 
@NamedQuery(name = "Satislar.findById", query = "SELECT s FROM Satislar s  WHERE s.id = :id"), 
@NamedQuery(name = "Satislar.findByAdet", query = "SELECT s FROM Satislar s WHERE s.adet = :adet"), 
@NamedQuery(name = "Satislar.findByTarih", query = "SELECT s FROM Satislar s WHERE s.tarih = :tarih"), 
@NamedQuery(name = "Satislar.findByUrunadi", query = "SELECT s FROM Satislar s WHERE s.urunadi = :urunadi"), 
@NamedQuery(name = "Satislar.findByMusteriadi", query = "SELECT s FROM Satislar s WHERE s.musteriadi = :musteriadi"), 
@NamedQuery(name = "Satislar.findByUrunkategori", query = "SELECT s FROM Satislar s WHERE s.urunkategori = :urunkategori"), 
@NamedQuery(name = "Satislar.findByUrunfiyat", query = "SELECT s FROM Satislar s WHERE s.urunfiyat = :urunfiyat"), 
@NamedQuery(name = "Satislar.findByUrunalis", query = "SELECT s FROM Satislar s WHERE s.urunalis = :urunalis")}) 
public class Satislar implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@DocumentId 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "id") 
private Integer id; 
@Basic(optional = false) 
@Column(name = "adet") 
private int adet; 
@Basic(optional = false) 
@Column(name = "tarih") 
@Temporal(TemporalType.TIMESTAMP) 
private Date tarih; 
@Basic(optional = false) 
@Column(name = "urunadi") 
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) 
private String urunadi; 
@Basic(optional = false) 
@Column(name = "musteriadi") 
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) 
private String musteriadi; 
@Basic(optional = false) 
@Column(name = "urunkategori") 
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO) 
private String urunkategori; 
@Basic(optional = false) 
@Column(name = "urunfiyat") 
private int urunfiyat; 
@Basic(optional = false) 
@Column(name = "urunalis") 
private int urunalis; 
... 

И это где я сделать полнотекстовый поиск:

fullTextSession.beginTransaction(); 

    QueryBuilder b = fullTextSession.getSearchFactory() 
      .buildQueryBuilder().forEntity(Satislar.class).get(); 

    Query luceneQuery 
      = b.keyword() 
      .wildcard() 
      .onFields(fields) 
      .matching(kelime + "*") 
      .createQuery(); 


    Query datequery = b 
    .range() 
     .onField("tarih").ignoreFieldBridge() 
     .from(DateTools.dateToString(new Date(2015, 12, 18 , 17, 40, 40), DateTools.Resolution.MILLISECOND)) 
     .to(DateTools.dateToString(new Date(2015, 12, 26 , 17, 40, 40), DateTools.Resolution.MILLISECOND)).excludeLimit() 
     .createQuery(); 

    org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(datequery); 
    List<Satislar> kayitliSatislar = fullTextQuery.list(); 


    dtmSonuc.setRowCount(0); 

    for (int i = 0; i < kayitliSatislar.size(); i++) { 

     Satislar satis = kayitliSatislar.get(i); 

     dtmSonuc.addRow(new String[]{satis.getMusteriadi(), satis.getUrunkategori(), satis.getUrunadi(), 
      Integer.toString(satis.getAdet()), Integer.toString(satis.getUrunfiyat()), satis.getTarih().toString()}); 

    } 

Есть 2 различных запросов. Один из них выполняет поиск по шаблону в полнотекстовом режиме по заданным полям, и он работает. А другой предполагается сделать поиск по диапазону, но он не работает

У меня есть 3 вопроса:

1-я использую MSSQL БД и тип даты поле даты и времени. Но это аннотируется как @Temporal(TemporalType.TIMESTAMP) в классе сущностей. Это проблема?

2-Почему диапазон поиска не работает?

3-Можно ли совместить полнотекстовый поиск с поиском диапазона?

ответ

1

Попробуйте добавить аннотацию к вашей Дате полю:

@Basic(optional = false) 
@Column(name = "tarih") 
@Temporal(TemporalType.TIMESTAMP) 
@DateBridge(resolution = Resolution.DAY) 
private Date tarih; 

Если он все еще не работает, попробуйте использовать Lucene родные запросы как это:

TermRangeQuery luceneRangeDateQuery = new TermRangeQuery(fieldName, DateTools.dateToString(from, DateTools.Resolution.DAY), 
       DateTools.dateToString(to, DateTools.Resolution.DAY), true, true); 

Это всегда работает. (Вы можете изменить DateTools.Resolution.DAY на HOUR, SECOND, YEAR ...)

+0

при попытке TermRangeQuery Я получаю ** string не может быть преобразован в bytesref ** error –

+0

Не могли бы вы показать более подробную информацию, пожалуйста? что вы помещаете вместо 'from' и' to' –

+0

'TermRangeQuery luceneRangeDateQuery = new TermRangeQuery (" tarih ", DateTools.dateToString (новая дата (2015, 12, 18, 17, 40, 40), DateTools.Resolution .DAY), DateTools.dateToString (новая дата (2015, 12, 26, 17, 40, 40), DateTools.Resolution.DAY), true, true) 'this дает ошибку –