2013-02-07 103 views
2

我有以下分析儀(輕微的調整的方式來雪球將設置):在elasticsearch加入/分割搜索詞(使用輪胎)

string_analyzer: { 
    filter: [ "standard", "stop", "snowball" ], 
    tokenizer: "lowercase" 
    } 

這裏它被施加到字段:

indexes :title, type: 'string', analyzer: 'string_analyzer' 

    query do 
    match ['title'], search_terms, fuzziness: 0.5, max_expansions: 10, operator: 'and' 
    end 

我在索引中創建了一個記錄,標題爲foo bar

如果我搜索foo bar它會出現在結果中。如果我搜索foobar它不會。

有人可以解釋爲什麼,如果可能我怎麼能得到它?

有人可以解釋我怎麼能得到這個相反的工作以及如果我有一個記錄標題foobar用戶可以搜索foo bar,並將其作爲結果?

謝謝

回答

2

您只能搜索索引中的標記。所以讓我們看看你在索引什麼。 您目前正在使用lowercase標記器(在非字母字符上標記字符串並將它們縮小),然後應用standard篩選器(冗餘,因爲您沒有使用標記器standard),stopsnowball篩選器。

如果我們創建了一個分析:

curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1' -d ' 
{ 
    "settings" : { 
     "analysis" : { 
     "analyzer" : { 
      "string_analyzer" : { 
       "filter" : [ 
        "standard", 
        "stop", 
        "snowball" 
       ], 
       "tokenizer" : "lowercase" 
      } 
     } 
     } 
    } 
} 
' 

,並使用analyze API來測試一下:

curl -XGET 'http://127.0.0.1:9200/test/_analyze?pretty=1&text=foo+bar&analyzer=string_analyzer' 

你會看到"foo bar"產生的條款["foo","bar"]"foobar"產生術語["foobar"] 。因此索引"foo bar"和搜索"foobar"目前無法正常工作。

如果您希望能夠搜索「內部」單詞,那麼您需要將單詞分成更小的單詞。爲此,我們使用ngram分析儀。

所以刪除測試指標:

curl -XDELETE 'http://127.0.0.1:9200/test/?pretty=1' 

,並指定一個新的分析:

curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1' -d ' 
{ 
    "settings" : { 
     "analysis" : { 
     "filter" : { 
      "ngrams" : { 
       "max_gram" : 5, 
       "min_gram" : 1, 
       "type" : "ngram" 
      } 
     }, 
     "analyzer" : { 
      "ngrams" : { 
       "filter" : [ 
        "standard", 
        "lowercase", 
        "ngrams" 
       ], 
       "tokenizer" : "standard" 
      } 
     } 
     } 
    } 
} 
' 

現在,如果我們測試的分析,我們可以得到:

"foo bar" => [f,o,o,fo,oo,foo,b,a,r,ba,ar,bar] 
"foobar" => [f,o,o,b,a,r,fo,oo,ob,ba,ar,foo,oob,oba,bar,foob,ooba,obar,fooba,oobar] 

所以,如果我們索引"foo bar",我們使用match查詢搜索"foobar",那麼查詢就會成爲查詢這些標記的查詢,其中一些標記存在於索引中。

不幸的是,它也會與"wear the fox hat"f,o,a)重疊。雖然foobar會出現在結果列表中較高的位置,因爲它有更多的共同標記,您仍然會得到明顯不相關的結果。

這可以通過使用minimum_should_match參數,例如控制:

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "match" : { 
     "my_field" : { 
      "minimum_should_match" : "60%", 
      "query" : "foobar" 
     } 
     } 
    } 
} 
' 

minimim_should_match的確切值取決於你的數據 - 實驗吧。

+0

感謝DrTech。有沒有什麼可以通過添加雪球作爲過濾器或沒有任何意義,因爲無論如何,單詞的開頭將與搜索詞相匹配? – user1116573

+0

是否有刪除停止過濾器的特殊原因,或者它只是停止過濾器可以刪除的一些單詞可能是ngram過濾器的塊? – user1116573

+0

正確,沒有什麼可以通過使用雪球過濾器,因爲你說的原因,是的,停止詞可能會干擾ngrams。我不會害怕停用詞。看看我的回答http://stackoverflow.com/a/14661309/819598 – DrTech