2013-07-23 59 views
0

嗨我正在開發使用彈性搜索的迷你應用程序。是否有任何選項可停止應用分析儀?

環境: -

 settingBuilder = XContentFactory.jsonBuilder().startObject() 
       .startObject("index") 
       .startObject("analysis") 
       .startObject("analyzer") 
       .startObject("custom_analyzer") 
       .field("type", "custom") 
       .field("tokenizer","keyword") 
       .field("filter", new String[]{"standard","ngram_filters"}) 
       .endObject() 
       .endObject() 
       .startObject("filter") 
       .startObject("ngram_filters") 
       .field("type", "nGram") 
       .field("min_gram", "1") 
       .field("max_gram","10") 
       .endObject() 
       .endObject() 
       .endObject() 
       .endObject() 
       .endObject(); 

映射: -

 contentBuilder = XContentFactory.jsonBuilder().startObject() 
     .startObject("students") 
     .startObject("properties") 
     .startObject("searchColumn") 
     .field("analyzer", "custom_analyzer") 
     .field("type", "string") 
     .endObject() 
     .startObject("firstName") 
     .field("type","string") 
     .field("analyzer", "custom_analyzer") 
     .field("store", "yes") 
     .endObject() 
     .startObject("lastName") 
     .field("type","string") 
     .field("analyzer", "custom_analyzer") 
     .field("store", "yes") 
     .endObject() 
     .startObject("registerNumber") 
     .field("type", "long") 
     .field("analyzer", "custom_analyzer") 
     .field("store", "yes") 
     .endObject() 
     .endObject() 
     .endObject() 
     .endObject(); 

在這裏,我指定NGRAM濾波器。但由於某種原因,在做搜索過程中,我不想將分析器應用於prefixFilter或prefixQuery。有沒有任何選擇。 我在這裏面臨的問題是,

例如。

apple 
    one apple 
    two apple 

假設這些是來自example的firstName值。 當我搜索字符'a'的前綴時,我必須只想獲得'apple'文檔。但現在,我得到所有的結果,因爲nGram ...你可以請任何解決方案嗎?

+0

你能否闡明答案是否有用或完全關閉? :) – javanna

回答

1

當您爲您的string fields定義映射時,可以使用index_analyzersearch_analyzer屬性定義應用於索引時間和查詢時間的不同分析器。您目前正在使用analyzer屬性,該屬性是在索引和查詢時間應用相同分析器的快捷方式。實際上,在索引時間和查詢時間,通常應用相似的文本分析鏈(如果不是相等的話),但ngrams絕對是一個例外,因爲您不想在查詢中生成ngram。

您只需定義兩個不同的分析儀,一個用於製作ngram,另一個則不用。更新那麼你的映射是這樣的:

.startObject("firstName") 
.field("type","string") 
.field("index_analyzer", "ngrams_analyzer") 
.field("search_analyzer", "search_analyzer_without_ngrams") 
+0

這會解決他的問題嗎?他(或她)說,搜索「a」應該只匹配「蘋果」而不是「一個蘋果」。但是如果在索引時間「一個蘋果」被破壞,那麼它將匹配(如果'min_gram'爲1)。 – ramseykhalaf

+0

@ramseykhalaf我這麼認爲。問題的這一部分並不明確,但如果我解決了這個問題,問題就是在查詢時停止製作ngram。無論如何,我想我們很快就會發現! :) – javanna

相關問題