对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
执行分析,除非您要求它不执行分析。问题可能是别的。但我不能告诉你那是什么。。。