У меня есть запрос 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-Можно ли совместить полнотекстовый поиск с поиском диапазона?
при попытке TermRangeQuery Я получаю ** string не может быть преобразован в bytesref ** error –
Не могли бы вы показать более подробную информацию, пожалуйста? что вы помещаете вместо 'from' и' to' –
'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 дает ошибку –