我在Elastic Search中对列表中的字段进行过滤时遇到问题。我正在为搜索和过滤索引简单的JSON对象。
正在编制索引的示例对象是:
{
"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 :(得分:0)
默认情况下,分析字符串字段("分解为可搜索的字词" Elasticsearch docs描述它的方式)。这不适用于术语过滤器,因为术语过滤器会进行精确匹配,但该字段将包含可能更改的版本。
您可以通过在映射中设置"index" : "not_analyzed"
来告诉Elasticsearch不要这样做。您对地理字段的映射应该类似于
"geos" : {
"type" : "object",
"properties" : {
"country" : { "type" : "string", "index" : "not_analyzed" },
"fullName" : { "type" : "string" }
}
}
您可能还希望将fullName设置为not_analyzed
,具体取决于您将如何使用它。如果要将其与术语查询或过滤器一起使用,则不应对其进行分析;如果你想进行模糊匹配,拼写校正等,就应该进行分析。