2014-02-21 119 views
21

我有以下的索引文件:ElasticSearch不返回結果對字符串屬性方面查詢

{ 
    "visitor": { 
     "id": <SOME STRING VALUE> 
    } 
} 

的文件的映射:

"visitor": { 
    "properties": { 
     "id": { 
      "type": "string" 
     } 
    } 
} 

當我運行以下查詢我得到的結果:

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      } 
     }, 
     "filter": { 
      "term": { "visitor.id": "123" } 
     } 
    } 
} 

儘管如此,這並不:

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      } 
     }, 
     "filter": { 
      "term": { "visitor.id": "ABC" } 
     } 
    } 
} 

我一直在想這與分析儀有關,並一直在追逐下來。我也一直在想,如果我錯誤地使用點符號來訪問嵌套的訪客屬性。

誰能告訴我爲什麼我不能用「ABC」的ID,但可以在訪客篩選遊客123

+2

我對分析儀的預感得到了回報。我發現將visitor.id設置爲「abc」而不是「ABC」時,我能夠獲得預期的結果。我正在研究默認字符串分析器在遇到所有大寫字母時會做什麼。但是,在我的映射中將字段設置爲「索引」:「not_analyzed」解決了問題。 「訪客」:{ 「屬性」:{ 「ID」:{ 「類型」: 「串」 「索引」: 「not_analyzed」 } } } – goatshepard

+4

正是這樣。這個問題的變種每週出現幾十次。你可能會發現這篇感興趣的文章:https://www.found.no/foundation/beginner-troubleshooting/ :) –

+0

感謝這篇文章,亞歷克斯。這非常有幫助。它鏈接到的帖子:https://www.found.no/foundation/text-analysis-part-1/更有幫助。 – goatshepard

回答

42

您需要了解elasticsearch的分析器是如何工作的。分析器執行標記(將輸入分成許多標記,例如空格)和一組標記過濾器(過濾掉不需要的標記,如stop words或修改標記,如將lowercase token filter轉換爲一切小寫)。

分析是在兩個非常特定的時間進行的 - 在索引過程中(當您將東西放入elasticsearch時)以及在搜索過程中(取決於您的查詢),您正在搜索的字符串中。

這就是說,默認分析器是它由一個standard tokenizerstandard token filter(清理從標準標記生成器的令牌)的standard analyzerlowercase token filter,和stop words token filter

舉個例子,當你保存字符串「我愛文森特的餡餅!」進入elasticsearch,你使用的是默認的標準分析器,你實際上存儲着「我」,「愛」,「文森」,「s」,「派」。然後,當您嘗試使用term查詢(這是未分析)搜索「Vincent's」時,您將找不到任何內容,因爲「Vincent's」不是這些令牌之一!但是,如果您使用match查詢(它是分析)搜索「Vincent's」,您會發現「我愛文森特的餡餅!」因爲「文森特」和「S」都找到匹配。

底線,或者:

  1. 搜索自然語言字符串時使用的分析後的查詢,如match
  2. 設置分析儀以滿足您的需求。你可以建立一個自定義的分析器,如果你想變得複雜,你可以設置一個自定義分析器來執行一個空白分詞器或一個字母分詞器或一個模式分詞器,以及任何你想要的濾波器。這取決於你的用例,但如果你在處理自然語言句子,我不建議這樣做,因爲標準詞源化程序是爲自然語言搜索而構建的。
  3. 您可以設置字段,可達到不使用分析儀下面的映射,它應該滿足您的需求:

    ​​

進一步的閱讀可見http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html

16

除非您指定不分析visitor.id字段,否則默認情況下會分析每個字段。

這意味着「ABC」將被索引爲「ABC」小寫)。

您必須使用帶字符串的字詞查詢或字詞過濾器小寫字母

我希望下面的查詢能正常工作。 ^^

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      } 
     }, 
     "filter": { 
      "term": { "visitor.id": "abc" } 
     } 
    } 
} 
+1

你節省了我的一天,非常感謝! –

相關問題