Hibernate Search Analyzer for Sort

时间:2016-02-26 05:32:23

标签: hibernate-search

在Hibernate Search 5.3上,我一直在尝试构建一个适合于对通过Hibernate Search索引的许多字段进行排序的分析器。我理解,对于排序,不应该分析该字段,但只要您的分析器返回单个令牌,我相信它没有问题,再加上您可以使用一些预构建的过滤器来区分大小写,HTML剥离,在我的情况下,我也想只排序前20个字符。

所以,像这样的东西似乎会起作用。

@AnalyzerDef(name = "sortAnalyzer", 
    tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class) ,        
    charFilters = { @CharFilterDef(factory = HTMLStripCharFilterFactory.class) },
    filters = 
            { 
                @TokenFilterDef(
                        factory = EdgeNGramFilterFactory.class,
                        params = {
                          @Parameter(name = "minGramSize",value = "20"),
                          @Parameter(name = "maxGramSize",value = "20")
                        }
                    ),                  
                @TokenFilterDef(factory = LowerCaseFilterFactory.class),
                @TokenFilterDef(factory = TrimFilterFactory.class)
            }
        ),

但是只有删除EdgeNGramFilterFactory才有效。我想我可以做一个桥来做子串。然后,我可以使用一个桥来完成整个事情并设置Analyze.NO。我的问题是推荐的是什么?桥梁与分析仪相比有什么优势吗?

我试图使用的分析仪的任何原因都不起作用?

1 个答案:

答案 0 :(得分:0)

EdgeNGramFilterFactory将创建多个令牌,因此违反了“单一令牌”的原则。所以这就是为什么它不起作用。

通常,当需要应用标记化并对属性进行排序时,解决方案是将属性索引为多个字段。

请参阅@Fields注释:

@Fields({
   @Field(name="sortable_something",analyzer=@Analyzer(definition="sortable_html_key")),
   @Field(name="something",analyzer=@Analyzer(definition="html_ngrams_key"))
})
public String getSomething() {