【发布时间】:2020-08-20 11:38:13
【问题描述】:
我有一个包含自定义分析器的字段。
@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
})
您知道如何为查询词设置自定义分析器吗?为什么默认不应用它?如果我搜索“bouees”,它可以工作,但如果我搜索“bouées”,它不会。
谢谢!
解决方案:
我的问题是我正在做一个simpleQueryString,而我应该做一个keyword 查询。 simpleQueryString 似乎没有在搜索词上运行分析器!然后我只需要关注@yrodiere .overridesForField( "description.values.value", "edgeNGram_query" ) 即可使用正确的搜索词分析器。
【问题讨论】:
标签: hibernate hibernate-search