2013-07-15 88 views
1

NGRAM我可以在Elasticsearch 搜索方面順便說一句,我設置的設置如下:搜索,其中Elasticsearch

.startObject("filter") 
    .startObject("lowercase") 
     .field("type", "lowercase") 
    .endObject() 
.endObject() 
.startObject("filter") 
    .startObject("ngram") 
     .field("type", "nGram") 
     .field("min_gram", "3") 
     .field("max_gram", "10") 
    .endObject() 
.endObject() 

然後我試圖映射該這樣。

builder.startObject().startObject(TYPE_TEST).startObject("properties"); 
    builder.startObject(title) 
      .field("type", "string") 
      .field("store", "yes") 
      .field("analyzer", "series_analyzer") 
      .field("boost", "10") 
    .endObject(); 

然後我搜索整個領域的「術語」這樣。

curl -XGET localhost:9200/test/_search?q="testte" 

我找不到與查詢,「一些部分條款」的任何結果。

相反,我可以得到很好的結果與此查詢

curl -XGET localhost:9200/test/_search?q=title:testte 

我只是想找尋與NGRAM方面沒有「標題」字段。我如何搜索整個領域的術語?

請讓我知道。在此先感謝

回答

5

只有在使用ngrams編制索引的字段上進行搜索時,纔可以通過ngrams獲取後部分匹配。在你的情況下,它是你的映射中定義的title字段。當您在query_string query中未指定字段時,它默認使用_all字段,該字段使用standard analyzer索引。您可以在查詢中指定不同的默認字段,以便您可以避免爲每個字詞指定它。如果您想將ngram應用於所有字段,您可以更改_all字段的映射,但我不會建議這樣做。 Ngram往往會大大增加您的索引大小,因此我不會將它們應用於任何地方。此外,對每個領域(或一組領域)應用不同的文本分析通常會更好,這通常是由領域驅動的。

此外,_all字段在入門和搜索所有內容時非常方便,但是它適用於所有字段的相同文本分析,您可能不想在生產中使用這些字段。我寧願建議從長遠來看禁用它。

另一個提示:看看match query,這是在大多數情況下使用的查詢。 query_string爲您提供了更多的權力,但它同時出錯。我會使用匹配查詢,除非您需要只有query_string提供的功能。

+0

感謝您的回覆。我可以用multiMatchQuery解決這個問題。謝謝。 – Soo