应该在must elasticsearch中进行查询

问题描述 投票:0回答:2

我是elasticsearch查询DSL的新手,我的ES索引中有以下文档

{
    "doc_id":1,
    "city_id": 1,
    "name": "test1",
    "vvip": false
},
{   
    "doc_id":2,
    "city_id": 1,
    "name": "test2",
    "vvip": false
},
{   
    "doc_id":3,
    "city_id": 1,
    "name": "test3"
}
{
    "doc_id":4,
    "city_id": 1,
    "name": "test4"
}
{
    "doc_id":5,
    "city_id": 1,
    "name": "test5",
    "vvip": true
}
{
    "doc_id":6,
    "city_id": 1,
    "name": "test6",
    "vvip": true
}

对于doc_id 3和doc_id 4 vvip字段不存在

我想以这样的方式构成查询:如果我查询vvip:true或vvip:false,则应始终返回这些文档

含义查询city_id = 1和vvip = false响应将包含doc_id 1,2,3,4对于city_id = 1和vvip = true响应将包含doc_id 3,4,5,6

我尝试了以下查询,但没有帮助

{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "city_id": "1"
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "vvip"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "city_id": "1"
                }
              },
              {
                "match": {
                  "vvip": false
                }
              }
            ]
          }
        }
      ]
    }
  }
}

elasticsearch querydsl elasticsearch-query
2个回答
0
投票

您可以像这样简化查询,它应该可以按预期工作:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city_id": "1"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "vvip": true
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "vvip"
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

查询表示您匹配city_id=1 ANDvvip=true ORvvip不存在)。


0
投票

您的方向正确,只需将must更改为should(意味着在第一个OR)查询中为bool

请参见下面的查询:

GET my_index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "city_id": "1"
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "vvip"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "city_id": "1"
                }
              },
              {
                "match": {
                  "vvip": false
                }
              }
            ]
          }
        }
      ]
    }
  }
}

说明:

此查询:

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city_id": "1"
          }
        },
        {
          "bool": {
            "must_not": {
              "exists": {
                "field": "vvip"
              }
            }
          }
        }
      ]
    }
  }
}

将为您提供文件3,4

此查询

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city_id": "1"
          }
        },
        {
          "match": {
            "vvip": false
          }
        }
      ]
    }
  }
}

将为您提供文件1,2

现在您想在它们之间设置OR,表示should

© www.soinside.com 2019 - 2024. All rights reserved.