如何在Hibernate Search中使用分析器?

时间:2014-06-23 14:39:19

标签: hibernate lucene hibernate-search infinispan

当我使用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_D611100然后分别找到它们并将2个结果合并在一起。会有一些结果不正确。

如果我忽略了分析仪,它将找到完全匹配,这也是不正确的。是否存在分析器可以忽略" - " ??

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不会拆分输入,它基本上将整个输入作为单个标记发出。