如何在Hibernate搜索中使用analyzer?

如何在Hibernate搜索中使用analyzer?,hibernate,lucene,hibernate-search,infinispan,Hibernate,Lucene,Hibernate Search,Infinispan,当我将Infinispan与Hibernate一起使用时,我需要使用Analyzer来查找包含关键字的结果 但是当我搜索关键字SNO_NO_D6-11100时,查询如下: QueryBuilder queryBuilder = CSECore.searchManager .buildQueryBuilderForClass(Hierarchy.class).get(); Query query = queryBuilder .keyword()

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

如果忽略分析器,它只会找到同样不正确的精确匹配。是否有一种解决方案可以让Analyzer忽略“-”?

尝试短语查询(参见第5.1.2.4节):


这两个术语仍然是分开的,但由于这是一个短语查询,它将搜索连续出现的两个单独的术语。所以它无法区分“SNO_NO_D6-11100”和“SNO_NO_D6 11100”,但我猜这可能是可以接受的。

使用Hibernate 5.10.3,我们可以在搜索时覆盖分析器:

FullTextEntityManager fte = Search.getFullTextEntityManager(em);
QueryBuilder qb = fte.getSearchFactory().buildQueryBuilder().forEntity(Article.class)
                .overridesForField("path", "keywordanalyzer")
                .get();
其中,
ngram\u search
是一个自定义分析器,定义如下:

@AnalyzerDef(name = "keywordanalyzer",
        tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class))

请注意,
KeywordTokenizerFactory
不会分割输入,它基本上会将整个输入作为一个单独的标记发出。

为了澄清,您正在查找包含
路径
字段中的术语
SNO\u NO\u D6-11100
的结果?是的,我需要Analyzer来执行此操作。Thx对于响应,这确实很有帮助。但我只是想知道是否有方法像我自己编写的
自定义桥接器那样编写我的
分析器
?您可以通过几种不同的方式将分析器设置为您喜欢的任何值,请参见:
@AnalyzerDef(name = "keywordanalyzer",
        tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class))