我想在hibernate搜索中使用语音搜索的强大功能。 问题是完全匹配没有排在搜索结果的顶部。 例如。搜索" john"返回这些结果列表:
我原本希望' john'在顶部列出
我用以下方式定义了我的分析器:
@AnalyzerDef(name = "phonetic",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = PhoneticFilterFactory.class, params = {
@Parameter(name = "encoder", value = "DoubleMetaphone"),
@Parameter(name = "inject", value = "true")
})
})
@Analyzer(definition = "phonetic")
public class User{
@Field(index=Index.TOKENIZED, store=Store.YES)
private String firstname;
@Field(index=Index.TOKENIZED, store=Store.YES)
private String lastname;
}
使用以下代码进行搜索:
String[] fields = new String[] { "firstname", "lastname" };
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields,
sf.getAnalyzer("phonetic"));
如果你能给我任何暗示/帮助,你将如何实现这一排名将会很棒。 我试图通过谷歌找到一些东西,我发现这必须实现 我自己使用查询扩展来提高精确匹配而不是语音搜索结果... 非常感谢你提前帮助我。 我正在使用Hibernate Search 3.1和Solr 1.3
BR, 沙恩
答案 0 :(得分:0)
从基于语音的分析器的角度来看, jon 和 john 两者完全相同。 Hibernate Search允许定义多个分析器,您还可以使用复数形式注释 @Fields 多次索引同一属性。
假设您在名为firstname_phonetic和firstname_standard的两个字段中索引 firstname ,然后可以创建两个针对每个字段的Query实例,并使用 BooleanQuery 组合两个查询 SHOULD 子句。这将使得得分手将两者的得分结合起来,以便精确匹配得分更高。
答案 1 :(得分:0)
您的查询应该按照您的指定工作。由于您在inject=true
上指定了PhoneticFilter
,因此您确实应该在完全匹配(即,互联网电话匹配和纯文本匹配)上获得更多的术语匹配,并且这证明了我的测试很关注。
我看到的问题是,您的分析会让您通过区分大小写搜索完全匹配。如果您索引" John",并搜索" john",语音匹配将很好地解决,但由于区分大小写,您将错过完全匹配。
只需在您的过滤器链中添加LowercaseFilter
就可以解决这个问题。我建议将其直接添加到PhoneticFilter
上方,例如:
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = PhoneticFilterFactory.class, params = {
@Parameter(name = "encoder", value = "DoubleMetaphone"),
@Parameter(name = "inject", value = "true")
})
}
PhoneticFilterFactory
上方的定位将元电话保持为大写,不仅遵循惯例,还确保互联网代码和纯文本不会相互匹配。实际上,无法想到任何可能引起关注的案例,但无论如何看起来都不错。
答案 2 :(得分:0)
感谢您的回答,我现在使用了“femtoRgon”的注释顺序,并使用@Fields(默认和语音)定义了多个分析器,当我将查询与标准和一个语音字段搜索结合使用不同的启动值时(更多2.0f启动标准)
感谢大家的帮助
BR, 沙恩