您只能搜索索引中的標記。所以讓我們看看你在索引什麼。 您目前正在使用lowercase
標記器(在非字母字符上標記字符串並將它們縮小),然後應用standard
篩選器(冗餘,因爲您沒有使用標記器standard
),stop
和snowball
篩選器。
如果我們創建了一個分析:
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
的確切值取決於你的數據 - 實驗吧。
感謝DrTech。有沒有什麼可以通過添加雪球作爲過濾器或沒有任何意義,因爲無論如何,單詞的開頭將與搜索詞相匹配? – user1116573
是否有刪除停止過濾器的特殊原因,或者它只是停止過濾器可以刪除的一些單詞可能是ngram過濾器的塊? – user1116573
正確,沒有什麼可以通過使用雪球過濾器,因爲你說的原因,是的,停止詞可能會干擾ngrams。我不會害怕停用詞。看看我的回答http://stackoverflow.com/a/14661309/819598 – DrTech