2

我想在休眠搜索中使用语音搜索的强大功能。问题是完全匹配没有排在搜索结果的顶部。例如,搜索“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

兄弟,谢恩

4

3 回答 3

0

从基于语音的分析器的角度来看,jon和john完全相同Hibernate Search 允许定义多个分析器,您还可以使用复数形式注释@Fields多次索引相同的属性。

假设您在名为 firstname_phonetic 和 firstname_standard 的两个字段中索引名字,然后您可以创建两个针对每个字段的 Query 实例,并使用BooleanQuerySHOULD子句组合这两个查询。这将使得分手将两者的分数结合起来,以便精确匹配的排名更高。

于 2014-04-07T23:28:16.633 回答
0

您的查询应该按照您指定的方式工作。由于您在 上指定inject=truePhoneticFilter您确实应该在完全匹配上获得更多术语匹配(即,变音位匹配和纯文本匹配),就我的测试而言,这证实了这一点。

我确实看到的问题是,您的分析使您可以区分大小写来搜索精确匹配。如果您索引“John”并搜索“john”,语音匹配会很好,但由于区分大小写,您会错过精确匹配。

只需将 a 添加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保持了变音位大写,既符合约定,又保证了变音位和纯文本不匹配。实际上,想不出任何会引起关注的情况,但无论如何看起来都不错。

于 2014-04-08T03:39:14.123 回答
0

感谢您的回答,我现在使用“femtoRgon”的注释顺序并使用@Fields(默认和语音)定义多个分析器,当我将查询与标准组合和一个与语音字段搜索结合使用不同的引导值(更多2.0f引导标准)

谢谢大家的帮助

兄弟,谢恩

于 2014-04-14T16:26:15.567 回答