对Hibernate搜索中的匹配项使用自定义分析器

对Hibernate搜索中的匹配项使用自定义分析器,hibernate,hibernate-search,Hibernate,Hibernate Search,我有一个字段,它有一个自定义分析器 @Analyzer(definition = "edgeNgram") @Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES) @Lob String value; 这是我班上的分析仪 @AnalyzerDef(name = "edgeNgram", tokenizer = @TokenizerDef(factory = W

我有一个字段,它有一个自定义分析器

@Analyzer(definition = "edgeNgram")
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
@Lob
String value;
这是我班上的分析仪

@AnalyzerDef(name = "edgeNgram",
        tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
        filters = {
                @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), // Replace accented characters by their simpler counterpart (è => e, etc.)
                @TokenFilterDef(factory = LowerCaseFilterFactory.class), // Lowercase all characters
                @TokenFilterDef(
                        factory = EdgeNGramFilterFactory.class, // Generate prefix tokens
                        params = {
                                @org.hibernate.search.annotations.Parameter(name = "minGramSize", value = "4"),
                                @org.hibernate.search.annotations.Parameter(name = "maxGramSize", value = "10")
                        }
                )
        })
这里我创建了我的查询

query = queryBuilder
        .simpleQueryString()
        .boostedTo(3f) // This whole query is boosted so exact matches will obtain a better score
        .onFields("title.value", "keyword.values.value")
        .boostedTo(2f)
        .andField("description.values.value")
        //.withAndAsDefaultOperator()
        .matching(Arrays.stream(searchTerm.split(" ")).map(e -> e + "*").collect(Collectors.joining(" ")).toLowerCase())
        .createQuery();
我不知道如何(在Hibernate Search的文档中找不到)为搜索项
searchTerm
设置分析器。基本上,我开始手动拆分,并在Java中将其设置为小写。但这似乎并不正确

我想对我的查询词应用另一个分析器,例如:

@AnalyzerDef(name = "edgeNGram_query",
        tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
        filters = {
                @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), // Replace accented characeters by their simpler counterpart (è => e, etc.)
                @TokenFilterDef(factory = LowerCaseFilterFactory.class) // Lowercase all characters
        })
您知道如何为查询项设置自定义分析器吗?为什么默认情况下不应用它?如果我搜索“boues”,它会工作,但如果我搜索“bouees”,它不会

谢谢

解决方案:


我的问题是我在做一个
simpleQueryString
,而我本应该做一个
关键字
查询。
simpleQueryString
似乎没有在搜索项上运行分析器!然后,我只需遵循@yrodiere
.overridesForField(“description.values.value”,“edengram\u query”)
即可使用正确的搜索词分析器。

在Hibernate search 5中,创建查询生成器时必须调用
overridesForField
,以覆盖每个字段的分析器:

@Analyzer(definition = "edgeNgram")
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
@Lob
String value;
QueryBuilder QueryBuilder=fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Hospital.class)
.overridesForField(“title.value”、“EdgeGram\u查询”)
.overridesForField(“关键字.values.value”,“EdgeGram\u查询”)
.overridesForField(“description.values.value”)
.get();
//然后一切照常
Query=queryBuilder
.SimpleQuery字符串()
.boostedTo(3f)//整个查询被提升,因此精确匹配将获得更好的分数
.onFields(“title.value”、“关键字.value.value”)
.boostedTo(2f)
.andField(“description.values.value”)
//.WithAndAndDefaultOperator()
.匹配(搜索术语)
.createQuery();
另请参见的结尾,这可能是您最初获得代码的地方:)

如果有一天您升级到HibernateSearch6(在Beta版中,使用不同的API),您会发现它更简单:在构建谓词时,有一个选项可供选择。例如:

List hits=searchSession.search(MyEntity.class)
.where(f->f.simpleQueryString()
.fields(“title.value”、“keyword.values.value”).boost(3f)
.fields(“description.values.value”)
.匹配(搜索术语)
//.defaultOperator(BooleanOperator.AND)

.analyzer(“edgeNGram_query”)//谢谢!这是否意味着在任何情况下,相同的分析器将应用于字段和搜索项?当我不调用
overridesForField
时,
EdgeGram
分析器将应用于我的搜索词?如果是这种情况,我不明白为什么“bouées”不起作用,“bouees”也起作用,即使我的分析器包括
ASCIIFoldingFilterFactory
。我的问题是我在做
simpleQueryString
,而我本应该做
关键字
查询。
simpleQueryString
似乎没有在搜索项上运行分析器
simpleQueryString
执行分析,除非您要求它不执行分析。问题可能是别的。但我不能告诉你那是什么。。。