语音搜索结果排名

时间:2014-04-07 17:33:37

标签: solr lucene hibernate-search phonetics

我想在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, 沙恩

3 个答案:

答案 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, 沙恩