2016-02-26 69 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