2016-09-18 102 views
0

我在文檔中有一個值爲「OK」的狀態。elasticsearch TERM查詢不返回包含確切字詞的文檔

以下匹配查詢返回我這個文件:

POST /bank/_search 
{ 
    "query": { 
     "bool" : { 
     "must" : { 
      "match" : { "state" : "OK" } 
     } 
}}} 

以下術語的查詢不符合國家「OK」返回我的文檔:

POST /bank/_search 
{ 
    "query": { 
     "bool" : { 
     "must" : { 
      "term" : { "state" : "OK" } 
     } 
}}} 

是根據定義「術語查詢查找包含倒排索引中指定的確切詞彙的文檔。「仍然我很困惑爲什麼術語查詢不會返回所需的文檔。

我通過感導入的數據通過執行以下命令:

curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json" 
curl 'localhost:9200/_cat/indices?v' 

這將是巨大的,如果有人也可以分享一些信息相/反轉,分析/非分析和長期/匹配。我讀了這些,但我仍然感到困惑。

回答

1

比賽查詢總是儘自己的匹配之前執行的搜索文本的分析,但期限查詢查找精確匹配。意思是

當您插入文本「OK」時,默認情況下,ES會進行分析(標準分析儀)並將文本存儲爲倒置索引中的「ok」(小寫)。

所以當你與匹配查詢

POST /bank/_search 
{ 
    "query": { 
     "bool" : { 
     "must" : { 
      "match" : { "state" : "OK" } 
     } 
}}} 

搜索了「OK」的文字轉換爲「OK」(按狀態分析器),並進行匹配。

對於術語查詢,您必須手動將文本更改爲下邊框,因爲它不對搜索時間執行分析。

POST /bank/_search 
{ 
    "query": { 
     "bool" : { 
     "must" : { 
      "term" : { "state" : "ok" } //lowercased 
     } 
}}} 

如果您總是查找「確定」,那麼您可以在狀態屬性中添加「未分析」。 這意味着在存儲時間狀態屬性將不會被分析和存儲,因此您的術語和匹配查詢將看起來精確的單詞。

請注意看, How to not-analyze in ElasticSearch?

+0

那奇怪。原始的json將「狀態」設置爲「確定」,並且仍然只有小寫的「確定」返回文檔。這是什麼原因?如果文本被設置爲不被分析,那麼我假設「確定」會返回文檔,「確定」不會,更正? – maverick

+0

還有一件事,當我輸入「Ok」或「oK」時,匹配查詢如何返回文檔?它是否改變每個小字符的輸入,即「好」,然後檢查?或倒排索引有「OK」,「ok」,「Ok」,「oK」即所有組合? – maverick

+0

是的,你是對的。如果不是標準分析器,匹配查詢總是檢查添加到屬性(Here state屬性)的分析器,然後在搜索文本上執行分析器。標準分析器的行爲降低了文本。所以你添加了什麼文字(好的,好的,等等),每一件東西都會被縮小和搜索 – LMK

相關問題