Hibernate Search 5.11 indexNullAs не работает - PullRequest
0 голосов
/ 31 января 2019

У меня есть обнуляемый столбец в моей индексированной сущности, и я хочу отфильтровать сущности, которые имеют null в соответствующем поле.Я использую Elasticsearch в качестве менеджера индекса.

@Field(analyze = Analyze.NO, indexNullAs = "2999-12-31")
@Column(name = "nullable_date")
private LocalDate nullableDate;

Я использовал атрибут indexNullAs в аннотации Field и, если я правильно понимаю документацию, значения null должны быть заменены значением "2999-12-31"в указателе.Но в Elasticsearch это поле имеет действительное значение null вместо строки "2999-12-31", которую я указал в аннотации:

"nullableDate": null,

Это поле находится в корневой индексируемой сущности (а не в IndexedEmbedded, поэтому это неПроблема https://hibernate.atlassian.net/browse/HSEARCH-2389).

Я пробовал запрос, подобный +nullableDate:null, и отправил его методу createFullTextQuery, но я получаю ошибку failed to parse date field [null] with format [strict_date||yyyyyyyyy-MM-dd] от Elasticsearch. Также я пробовал запросы, подобные +nullableDate:2999-12-31, и, очевидно, яполучить пустой результат (так как поле имеет значение null в Elastic).

Означает ли это, что indexNullAs не работает должным образом (это https://hibernate.atlassian.net/browse/HSEARCH-3099 проблема?) или я использую егонеправильно? Спасибо.

1 Ответ

0 голосов
/ 31 января 2019

Я думаю, что проблема в вашем запросе, а не в индексации.indexNullAs работает для LocalDate на Elasticsearch (я только что проверил это дважды).

Как вы строите свои запросы?Если вы используете indexNullAs, вам, вероятно, следует использовать наш DSL.

В любом случае это работает:

        QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( MyEntity.class ).get();
        Query luceneQuery = queryBuilder.keyword()
                .onField( "nullableDate" )
                .matching( LocalDate.of( 2999, Month.DECEMBER, 31 ) )
                .createQuery();
        result = session.createFullTextQuery( luceneQuery, MyEntity.class ).list();

И это тоже:

        QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( MyEntity.class ).get();
        Query luceneQuery = queryBuilder.keyword()
                .onField( "nullableDate" )
                .matching( null )
                .createQuery();
        result = session.createFullTextQuery( luceneQuery, MyEntity.class ).list();

Ожидается тот факт, что Hibernate Search отправляет «ноль», и на самом деле это особенность: он позволяет правильно извлекать ноль при использовании проекций.Что касается индексации, отображение Elasticsearch (то есть схема), сгенерированное Hibernate Search и отправленное в Elasticsearch, должно включать в себя что-то вроде этого:

properties: {
    ...

    "nullableDate": {
        "type": "date",
        "format": "yyyyyyyyy-MM-dd",
        "null_value": "2999-12-31"

    }

    ...

}

Часть null_value означает, что всякий раз, когда Elasticsearch получает нулевое значение, онобудет индексировать его как «2999-12-31».Это именно то, что вы хотели.

Кстати, HSEARCH-3099 - лишь задача напомнить нам о необходимости добавить эту функцию в Hibernate Search 6;это никак не влияет на 5.11.

...