Hibernate Search 6 возвращает результат, но значение пояснения равно 0.0

#java #spring-boot #hibernate #hibernate-search

#java #весенняя загрузка #переход в режим гибернации #переход в режим гибернации-поиск

Вопрос:

Я экспериментирую с hibernate search 6, поскольку 5 было намного сложнее использовать для меня.

Но когда объяснение соответствия равно 0.0, объект все равно возвращается в результате?

И почему 0.0 иногда бывает таким

 2020-09-15 21:57:43.107  INFO 18032 --- [nio-8080-exec-8] n.l.a.s.r.search.HibernateSearchService  : 0.0 = Failure to meet condition(s) of required/prohibited clause(s)
  0.0 = no match on required clause ((MatchNoDocsQuery("empty BooleanQuery"))^4.0 description:amonsdu platform:amonsdu platformId:amonsdu)
    0.0 = No matching clauses
  0.0 = match on required clause, product of:
    0.0 = # clause
    1.0 = __HSEARCH_type:main
  

=> не возвращается как результат

и иногда это?

 2020-09-15 21:57:46.475  INFO 18032 --- [io-8080-exec-10] n.l.a.s.r.search.HibernateSearchService  : 0.0 = sum of:
  0.0 = sum of:
    0.0 = ConstantScore(name:us)^0.0
  0.0 = match on required clause, product of:
    0.0 = # clause
    1.0 = __HSEARCH_type:main

  

=> возвращается как результат

вот код, который обрабатывает поиск

 @Transactional
    public Page<Game> fuzzySearch(String searchTerm, Pageable pageable) {
        SearchSession searchSession = Search.session(entityManager);
        LuceneSearchQuery<Game> gameSearchQuery = searchSession.search(Game.class)
                .extension(LuceneExtension.get())
                .where(f -> f.bool()
                        .should(
                                f.match()
                                        .field("name")
                                        .matching(searchTerm)
                                        .fuzzy(2, 0)
                                        .boost(4)
                        ).should(
                                f.phrase()
                                        .field("description")
                                        .matching(searchTerm)
                                        .slop(3)
                                        .boost(1)
                        )
                        .should(
                                f.match()
                                        .fields("platform", "platformId")
                                        .matching(searchTerm)
                        )

                ).toQuery();
        SearchResult<Game> result = gameSearchQuery.fetch((int) pageable.getOffset(), pageable.getPageSize());
        Explanation explanation = gameSearchQuery.explain(21L);
        log.info(explanation.toString());
        log.info(result.hits().toString());
        return new PageImpl<>(result.hits(), pageable, result.total().hitCount());
    }
  

Объект, в котором выполняется поиск

 @Data
@MappedSuperclass
public class GameInfo {

    @FullTextField(analyzer = "gameName")
    @NotBlank
    @Size(min = 2, max = 500)
    private String name;

    @FullTextField(analyzer = "gameDescription")
    @Size(max = 6000)
    private String description;

    @KeywordField
    private String platform;

    @KeywordField
    private String platformId;


}
  

И пользовательские анализаторы

  public void configure(LuceneAnalysisConfigurationContext context) {
            context.analyzer("gameName").custom()
                    .tokenizer(WhitespaceTokenizerFactory.class)
                    .tokenFilter(LowerCaseFilterFactory.class);
            context.analyzer("gameDescription").custom()
                    .tokenizer(StandardTokenizerFactory.class)
                    .tokenFilter(LowerCaseFilterFactory.class)
                    .tokenFilter(SnowballPorterFilterFactory.class)
                        .param("language","English");
    }
  

Комментарии:

1. Это выглядит странно, но я не смог воспроизвести это поведение. Каково значение различных свойств для Game экземпляра, который соответствовал? Не могли бы вы настроить этот проект так, чтобы воспроизвести проблему?

2. Я получил его для воспроизведения здесь: github.com/LelouBil/hibernate-search-test Я думаю, что я совпадаю с любым запросом из 2 букв, потому что ключевое слово «us» всегда будет иметь максимальное расстояние редактирования 2 от любого другого запроса из 2 букв, поэтому тот факт, что оно совпадает, не является ошибкой, я думаю. Однако я думаю, что объяснение все еще неверно, но оно исходит от lucene, а не от hibernate search, верно?

3. Похоже, что там есть спойлер… Я не благодарю вас 🙂 Что касается вашей проблемы… Да, вероятно, поэтому оно совпадает. И действительно, Hibernate Search только пересылает объяснение из Lucene.

4. @yrodiere у вас есть какие-либо идеи, как / где я мог бы сообщить об этом для lucene?

5. @LelouBill Я не совсем уверен, что это ошибка, которая может быть преднамеренной. Лучше сначала перенести это в список рассылки: lucene. apache.org/core/discussion.html . Если им нужен код Lucene, я не уверен, что это будет очень полезно, но вот что вы делаете: github.com/hibernate/hibernate-search/blob /…