#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 /…