2016-02-26 62 views
0

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

所以,像这样的事情似乎会起作用。

@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。我的问题是建议什么?桥梁与分析仪有什么优势?

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

回答

0

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

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

@Fields注释:

@Fields({ 
    @Field(name="sortable_something",[email protected](definition="sortable_html_key")), 
    @Field(name="something",[email protected](definition="html_ngrams_key")) 
}) 
public String getSomething() { 
+0

感谢@Sanne - 我觉得我的想法是滥用'EdgeNGramFilterFactory'作为一个子字符串,因为我告诉了只给我20度字符的最小值和最大值,就只有一个可能的令牌从左边开始工作,这将是前20个字符。但是,无论如何,我已经决定搭桥去做子串,然后用分析器去做其余的事情。 – winklebort