2013-10-17 60 views
0

我在彈性搜索列表中的字段內進行過濾時遇到問題。我將索引簡單的JSON對象用於搜索和過濾。Elasticsearch在列表中的字段上進行過濾

被索引的一個例子中的物體是:

{ 
    "id" : 1, 
    "name" : "My Inventory", 
    "description" : "This is a piece of inventory.", 
    "sizes" : [ "big", "small" ], 
    "geos" : [ { "country" : "US", "fullName" : "United States" } ] 
} 

我可以通過ID,名稱,描述和大小很容易地過濾,而是試圖對地理過濾的時候,我打一個磚牆。以下是我正在嘗試使用的過濾器。我會很感激任何一種指針讓我朝着正確的方向前進。謝謝!

curl -XPOST 'localhost:9200/stuff/inventory/_search?pretty=true' -d ' 
    { 
     "fields" : [ "name" ], 
     "filter" : { 
      "terms" : { "geos.country" : [ "US" ] } 
     } 
    } 
' 
+0

你使用了正確的映射嗎? http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-array-type.html – phoet

+0

你回來了什麼?如果問題是你得到0結果可能是因爲你索引lowercased?試試「我們」。或者,如果您使用defaukt映射,則「我們」是一個停用詞,因此它根本不會被索引。 – javanna

+0

@javanna你說得對。我只對所有字段使用了默認索引,但我使用的是小寫字母。 – mackwo

回答

0

默認情況下,字符串字段進行分析(「分解成可搜索的條款」是Elasticsearch docs如何描述它)。這不適用於術語過濾器,因爲術語過濾器確實匹配,但該字段將包含可能更改的版本。

您可以通過在映射中設置"index" : "not_analyzed"來告訴Elasticsearch不要這樣做。您的GEOS字段映射應該像

"geos" : { 
    "type" : "object", 
    "properties" : { 
     "country" : { "type" : "string", "index" : "not_analyzed" }, 
     "fullName" : { "type" : "string" } 
    } 
} 

您可能需要全名設置爲not_analyzed也取決於你打算如何使用它。如果您想將其與期限查詢或過濾器結合使用,則不應進行分析;如果你想做模糊匹配,拼寫校正等,應該進行分析。

+0

謝謝。由於國家代碼只是一個單詞,因此我可以將術語過濾器的值降低。如果我試圖對fullName字段或使用多個詞的其他字段進行過濾,此信息肯定會有所幫助。 – mackwo

+0

爲什麼默認分析儀不工作?是因爲國家字段是2個字符還是一個停用詞。我不清楚爲什麼默認分析儀沒有對「美國」這個術語進行索引。 – thetoolman

相關問題