ElasticSearch - 单个匹配到多个

时间:2016-07-20 19:48:26

标签: elasticsearch

请注意,我是ElasticSearch的全新手,我正处于紧张状态。我有以下查询:

{
    "query": {
        "filtered": {
            "query": {
                "match": {
                    "state": "VA"
                }
            },
            "filter": {
                "and": [
                    {
                        "bool": {
                            "must": [
                                {
                                    "match": {
                                        "status": "Active"
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "sort": [
        "dom"
    ],
    "size": 1
}

目前,代码库仅支持搜索具有特定状态的项目。我试图修改它以支持可能的状态值列表。现在,我已经看到了可以使用shouldterms的位置,但两者的结果都是空数据集。

我已经尝试过这样做,但我看到的例子要么不起作用,要么解释得很差(如果有的话),或者依赖于阅读和吸收文档页面(我根本就没有有时间)。如何修改顶部查询以搜索多个值?

更新

运行以下内容:

curl -XGET localhost:9200/listings/_mapping/listing/field/state?pretty

我已经获得了这种映射:

{
  "listings" : {
    "mappings" : {
      "listing" : {
        "state" : {
          "full_name" : "state",
          "mapping" : {
            "state" : {
              "type" : "string"
            }
          }
        }
      }
    }
  }
}

更新2

我已更新映射以将其设置为not_analyzed并启用store选项。数据已重新导入。新请求如下所示:

{
    "query":{
        "filtered":{
            "filter":{
                "and":[
                    {
                        "bool":{
                            "should":[
                                {
                                    "terms":{
                                        "state":["VA","MD"]
                                    }
                                }
                            ]
                        }
                    },{
                        "bool":{
                            "must":[
                                {
                                    "match":{
                                        "status":"Active"
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "sort":["dom"],
    "size":1
}

1 个答案:

答案 0 :(得分:0)

您是否尝试替换“逆向工程”查询的内部“查询”?

这样的事情:

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "state": "VA"
              }
            },
            {
              "match": {
                "state": "MD"
              }
            }
          ]
        }
      },
      "filter": {
        "and": [
          {
            "bool": {
              "must": [
                {
                  "match": {
                    "status": "Active"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  },
  "sort": [
    "dom"
  ],
  "size": 1
}

顺便说一下,这个查询有点乱。您可以将“必须”和“应该”条款组合在一个“bool”下进行重新构造。然后,您可以丢弃“已过滤”的查询,并在根“查询”标记下立即使用单个“bool”,或者丢弃“过滤”部分的“查询”部分,并仅使用“过滤器”部分。