elasticsearch - 具有多个条件的术语过滤器

时间:2015-02-19 19:06:03

标签: java elasticsearch lucene querydsl

我希望在一次点击ES中搜索具有2个或更多条件的多个值。

For Eg, "customer" index has 2 fields userid and order。我使用下面的查询来搜索匹配这两个字段的结果。

`{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "and": [
          {
            "terms": {
              "userid": [
                "1","2"
              ]
            }
          },
          {
            "terms": {
              "order": [
                 "A","B"
              ]
            }
          }
        ]
      }
    }
  }
}`

结果匹配满足所有组合的文档(如1&A, 1&B, 2&A, 2&B)。但我需要仅在发送的顺序中匹配结果(如1&A, 2&B)。我们可以通过条款过滤器或任何其他替代方案来实现

2 个答案:

答案 0 :(得分:1)

您始终可以使用嵌套的"and""or" s:

POST /test_index/_search
{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "or": {
                    "filters": [
                        { "and": [
                            { "term": { "userid": { "value": "1" } } },
                            { "term": { "order": { "value": "A" } } }
                        ]},
                        { "and": [
                            { "term": { "userid": { "value": "2" } } },
                            { "term": { "order": { "value": "B" } } }
                        ]}
                    ]
                }
            }
        }
    }
}

答案 1 :(得分:0)

为了实现这一目标,您需要将字段“userid”和“order”放在嵌套字段中。像这种映射的东西:

{
    "index1" : {
        "mappings" : {
            "type1" : {
                "properties" : {
                    "iAmNested" : {
                        "type" : "nested",
                        "properties" : {
                            "userid" : {
                                "type" : "string"
                            },
                            "order" : {
                                "type" : "string"
                            }
                        }
                    }
                }
            }
        }
    }
}

然后,您将使用嵌套过滤器进行查询,可在此处找到信息:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html