当我使用Infinispan和Hibernate时,我需要使用Analyzer来查找包含关键字的结果。
但是,当我使用以下查询搜索关键字SNO_NO_D6-11100
时:
QueryBuilder queryBuilder = CSECore.searchManager
.buildQueryBuilderForClass(Hierarchy.class).get();
Query query = queryBuilder
.keyword().onField("path").matching("SNO_NO_D6-11100").createQuery();
它将SNO_NO_D6-11100
分隔为SNO_NO_D6
和11100
然后分别找到它们并将2个结果合并在一起。会有一些结果不正确。
如果我忽略了分析仪,它将找到完全匹配,这也是不正确的。是否存在分析器可以忽略" - " ??
答案 0 :(得分:1)
尝试使用词组查询(请参阅第5.1.2.4节in the hibernate query dsl):
Query query = queryBuilder.phrase().onField("path").sentence("SNO_NO_D6-11100").createQuery();
这两个术语仍然是分开的,但由于它是一个短语查询,它将搜索连续出现的两个单独的术语。所以它无法区分“SNO_NO_D6-11100”和“SNO_NO_D6 11100”,但我猜这可能是可以接受的。
答案 1 :(得分:0)
使用Hibernate 5.10.3,我们可以在搜索时覆盖分析器:
FullTextEntityManager fte = Search.getFullTextEntityManager(em);
QueryBuilder qb = fte.getSearchFactory().buildQueryBuilder().forEntity(Article.class)
.overridesForField("path", "keywordanalyzer")
.get();
ngram_search
是一个自定义分析器,定义如下:
@AnalyzerDef(name = "keywordanalyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class))
请注意,KeywordTokenizerFactory
不会拆分输入,它基本上将整个输入作为单个标记发出。