Elasticsearch对列表中的字段进行过滤

时间:2013-10-17 18:03:42

标签: list search filter elasticsearch

我在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" ] }
        }
    }
'

1 个答案:

答案 0 :(得分:0)

默认情况下,分析字符串字段("分解为可搜索的字词" Elasticsearch docs描述它的方式)。这不适用于术语过滤器,因为术语过滤器会进行精确匹配,但该字段将包含可能更改的版本。

您可以通过在映射中设置"index" : "not_analyzed"来告诉Elasticsearch不要这样做。您对地理字段的映射应该类似于

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

您可能还希望将fullName设置为not_analyzed,具体取决于您将如何使用它。如果要将其与术语查询或过滤器一起使用,则不应对其进行分析;如果你想进行模糊匹配,拼写校正等,就应该进行分析。