2012-09-07 21 views
6

我使用我的查詢字符串搜索雪球分析結果...像這樣Elasticsearch打雪仗分析儀只返回朵朵字

"query" : { 
     "query_string" : { 
     "query" : the-query-string-goes-here, 
     "default_operator" : "AND", 
     "analyzer" : "snowball" 
     } 
    } 

這其實工作原理,但它確實很奇怪......搜索「戰鬥「將返回」戰鬥「的結果,但忽略」戰鬥「的結果。搜索「船員」將返回「船員」,但不是「船員」的結果,也搜索「船員」也忽略「船員」的結果...

任何人都知道發生了什麼事?

+0

你解決了嗎?我可否知道我的答案是否有用? – javanna

+0

我將默認分析儀設置爲雪球,並處理了它,但我仍不明白爲什麼只是將它設置在查詢字符串中不起作用。如何索引不同,在一個案件中尋找戰鬥(默認分析儀設置爲雪球)實際上可以拉起「戰鬥」的職位,但另一個(只是在查詢字符串中指定)沒有。 – concept47

+0

就像我在我的回答中所寫的那樣,如果僅在查詢時應用詞幹分析,則最終會在索引期間在未被阻止的字段中搜索詞幹。很高興你解決了! – javanna

回答

11

當您在索引時間和查詢時間應用它時,詞幹有意義。現在您在查詢時應用它,以便搜索查詢中包含的詞的詞幹。 但我猜索引不包含詞幹,因爲你沒有在索引時間應用詞幹。實際上,您正在搜索_all字段,因爲您沒有在查詢中指定任何字段名稱,也沒有使用query_string支持的default_field(或fields)屬性。 _all字段默認使用StandardAnalyzer進行分析。

有不同的方法可以解決這個問題。我親自決定一組您想要在查詢中搜索的字段,並將其應用到您的映射中。之後,您不需要在查詢中指定分析儀,因爲將使用您正在搜索的字段的配置分析儀。

讓我知道答案是否足夠清楚。

+0

這很有道理。但爲什麼它會忽略與查詢完全匹配的項目? (即搜索「戰鬥」不會返回一個標題爲「戰鬥」的帖子,但它會返回一個標題爲「戰鬥」的帖子) – concept47

+0

,因爲當你應用干擾查詢時,戰鬥變爲戰鬥。你真的在尋找戰鬥而不是戰鬥。 ;) – javanna

+0

這意味着我的問題仍然存在,即使我在索引上使用了stemmer?我怎樣才能使它在搜索詞和實際查詢中都能搜索...... Sphinx自動執行此操作,有點讓我驚訝於這裏的實現 – concept47

2

感謝@javanna爲我指出了正確的方向。我通過將_all字段的分析器設置爲snowball來解決此問題。詳細信息請參見this doc

我使用Ruby輪胎寶石,我能夠在我的模型到指定映射如下:

mapping(_all: { analyzer: 'snowball' }) do 
    indexes :id, type: 'integer' 
    indexes :description 
    indexes :name, boost: 10 
end 

我格式化我的查詢酷似原來的問題。