2014-10-27 71 views
0

我在Elasticsearch這些文件:無法通過陣列搜索在elasticsearch

{ 
    "id_object": "9", 
    "size_id": "-1", 
    "enabled": 1, 
    "verified": 0, 
    "countries": [ 
     "Germany" 
    ] 
}, 
{ 
    "id_object": "19", 
    "size_id": "-1", 
    "enabled": 1, 
    "verified": 0, 
    "countries": [ 
     "Germany", 
     "France" 
    ] 
} 

我用下面的語句來抓取有「德國」的所有文檔裏面:

GET abc/def/_search 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
    "bool": { 
     "must": { 
     "term": { 
      "countries": "Germany" 
     } 
     } 
    } 
    } 
} 

} }

但它沒有返回結果! 我做錯了什麼?

回答

2

未對術語「過濾器」進行分析,這意味着它們將與精確的術語匹配,而不會進行壓縮,也不會進行任何其他過濾或處理。因此,您的查詢將通過完全匹配「德國」來查看倒排索引,而如果您在將這兩個文檔放入ES中時使用了標準分析器,則它們將被記錄爲「德國」(小寫)和「法國」小寫。

所以,你的情況你的過濾器將匹配這樣的:

{ "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": { 
      "term": { 
       "countries": "germany" 
      } 
      } 
     } 
     } 
    }}} 

在另一方面,「匹配」的查詢進行分析,所以,如果你要尋找的「德」,這不是將匹配:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      {"match": { 
       "countries": "Germany" 
      }} 
      ] 
     } 
     } 
    } 
    } 
} 
+0

如果我有300萬個文件,哪一個會更快?查詢或過濾? – 2014-10-27 08:34:57

+2

過濾器。如果您經常查詢相同的術語,那麼它將有助於緩存過濾器。 – 2014-10-27 08:36:37

+0

令人驚歎,謝謝 – 2014-10-27 08:42:25