Как определить, попадает ли результат между 2 датами в индексе lucene?

#hibernate #spring-boot #search #lucene #hibernate-jpa

#впасть в спящий режим #пружинный ботинок #Поиск #люциен #спящий режим-jpa

Вопрос:

Я пытаюсь определить, попадает ли дата истечения срока действия между сегодняшним днем и другой указанной датой. Хотя в моей базе данных есть результаты, поисковый запрос, похоже, не извлекает значение. Пожалуйста, помогите!

Это выполняемый запрос: jpaQuery: FullTextQueryImpl( membershipStatus:full_member AccountManager.FirstName:nikki ExpiryDate:[20190416 — 20190516})

Кроме того, база данных имеет дату истечения срока действия в формате ГГГГ-ММ-дд ЧЧ: мм: сс, не уверен, как сопоставить поля.

Это запрос:

 Query expiringInQuery = queryBuilder
    .range()
    .onField("expiryDate")
    .ignoreFieldBridge()
    .from(DateTools.dateToString(today, DateTools.Resolution.DAY)) 
    .to(DateTools.dateToString(expiringDate, DateTools.Resolution.DAY))
    .excludeLimit()
    .createQuery();
 

Это относится к сущности:

 @Field
@Column(name = "expiryDate")
@Temporal(TemporalType.TIMESTAMP)
@JsonIgnore
@IndexedEmbedded
@DateBridge(resolution=org.hibernate.search.annotations.Resolution.DAY, encoding = EncodingType.STRING)
private Date expiryDate;
 

Ответ №1:

Если вы сохранили их в поле даты, посмотрите здесь: https://lucene .apache.org/solr/guide/6_6/working-with-dates.html

Таким образом, правильный синтаксис будет примерно таким (вы могли бы не указывать время)

 datefield:[2019-04-16T00:00:00.000Z TO 2019-05-16T23:59:59.999Z]
 

например, DateRangeField также допускает такие запросы, как

 [2014 TO 2014-12-01]
 

проверьте ссылку.

Ответ №2:

Это то, что наконец сработало.

  String expiringIn = (inputsMap.get("expiringIn").equals("None")) ? "*" : 
 (inputsMap.get("expiringIn"));
 Date today = DateUtils.truncate(new Date(), Calendar.DATE);

 Query luceneQuery = queryBuilder
            .range()
            .onField("expiryDate")
            .from(today)
            .to(expiringDate)
            .createQuery();
 

На объекте,

 @Field
@Column(name = "expiryDate")
@Temporal(TemporalType.TIMESTAMP)
@JsonIgnore
@IndexedEmbedded
@DateBridge(resolution = org.hibernate.search.annotations.Resolution.MILLISECOND, 
encoding = EncodingType.STRING)
private Date expiryDate;