【问题标题】:Query with And & OR in Elastic Search在 Elastic Search 中使用 And & OR 进行查询
【发布时间】:2022-10-04 16:16:30
【问题描述】:

我是 Elastic Search 的新手,我有如下文件:

相同 JSON 索引的映射如下:

映射

{
      "mappings": {
        "properties": {
          "age": {
            "type": "long"
          },
          "hobbiles": {
            "type": "keyword"
          }
        
      }
    }
}

一些示例文件如下所示:

        [{
        "_id": "test@domain.com",
        "age": 12,
        "hobbiles": [{
                "name": "Singing",
                "level": "begineer"
            },
            {
                "name": "Dancing",
                "level": "begineer"
            }
        ]
    },
    {
        "_id": "test1@domain.com",
        "age": 7,
        "hobbiles": [{
                "name": "Coding",
                "level": "begineer"
            },
            {
                "name": "Chess",
                "level": "begineer"
            }
        ]
    },
    {
        "_id": "test2@domain.com",
        "age": 20,
        "hobbiles": [{
                "name": "Singing",
                "level": "begineer"
            },
            {
                "name": "Dancing",
                "level": "begineer"
            }
        ]
    },
    {
        "_id": "test3@domain.com",
        "age": 21,
        "hobbiles": [{
                "name": "Coding",
                "level": "begineer"
            },
            {
                "name": "Dancing",
                "level": "Football"
            }
        ]
    }
]

 

现在我想获取 id IN (test@domain.com, test1@domain.com) 和年龄大于 5 的文档。 [操作上] hobiiles Football。

我对输出的期望是我应该得到三个文档:如果爱好不匹配,那么它也应该没问题,但如果爱好匹配,那么该文档应该在最前面。基本上我想匹配爱好,但如果它不匹配它是可选的,那么我也应该根据先前的子句获取数据。

[test3@domain.com, test@domain.com, test1@domain.com]

测试 3 在顶部,因为 Football 在那里匹配,测试和测试 1 因为 age 和 id 匹配在那里。

【问题讨论】:

    标签: elasticsearch opensearch


    【解决方案1】:

    这需要使用Should 子句。应该等价于“或”。因此,如果满足 should 查询中的任何一个条件,就会返回一个文档。

    对于 id 和 age 的条件,我使用了 filter 子句。它相当于 "AND" 。过滤子句不计算匹配文档的分数,因此任何匹配“hobbiles.level”的文档都会排名更高。

    询问

    {
      "query": {
        "bool": {
          "minimum_should_match": 1, 
          "should": [
            {
              "term": {
                "hobbiles.level.keyword": {
                  "value": "Football"
                }
              }
            },
            {
              "bool": {
                "filter": [
                  {
                    "terms": {
                      "id.keyword": [
                        "test@domain.com",
                        "test1@domain.com"
                      ]
                    }
                  },
                  {
                    "range": {
                      "age": {
                        "gt": 5
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    

    结果

      "hits" : [
          {
            "_index" : "index8",
            "_type" : "_doc",
            "_id" : "qE06noMBfFiM6spcUTo4",
            "_score" : 1.3112575,
            "_source" : {
              "id" : "test3@domain.com",
              "age" : 21,
              "hobbiles" : [
                {
                  "name" : "Coding",
                  "level" : "begineer"
                },
                {
                  "name" : "Dancing",
                  "level" : "Football"
                }
              ]
            }
          },
          {
            "_index" : "index8",
            "_type" : "_doc",
            "_id" : "pE03noMBfFiM6spc4jr2",
            "_score" : 0.0,
            "_source" : {
              "id" : "test@domain.com",
              "age" : 12,
              "hobbiles" : [
                {
                  "name" : "Singing",
                  "level" : "begineer"
                },
                {
                  "name" : "Dancing",
                  "level" : "begineer"
                }
              ]
            }
          },
          {
            "_index" : "index8",
            "_type" : "_doc",
            "_id" : "pU03noMBfFiM6spc6DqZ",
            "_score" : 0.0,
            "_source" : {
              "id" : "test1@domain.com",
              "age" : 7,
              "hobbiles" : [
                {
                  "name" : "Coding",
                  "level" : "begineer"
                },
                {
                  "name" : "Chess",
                  "level" : "begineer"
                }
              ]
            }
          }
        ]
    

    【讨论】:

      【解决方案2】:

      特长;

      它可以通过布尔查询来实现。

      解决方案

      PUT /_bulk
      {"index":{"_index":"73935795", "_id":"test@domain.com"}}
      {"age":12,"hobbiles":[{"name":"Singing","level":"begineer"},{"name":"Dancing","level":"begineer"}]}
      {"index":{"_index":"73935795", "_id":"test1@domain.com"}}
      {"age":7,"hobbiles":[{"name":"Coding","level":"begineer"},{"name":"Chess","level":"begineer"}]}
      {"index":{"_index":"73935795", "_id":"test2@domain.com"}}
      {"age":20,"hobbiles":[{"name":"Singing","level":"begineer"},{"name":"Dancing","level":"begineer"}]}
      {"index":{"_index":"73935795", "_id":"test3@domain.com"}}
      {"age":21,"hobbiles":[{"name":"Coding","level":"begineer"},{"name":"Dancing","level":"Football"}]}
      
      GET 73935795/_search
      {
        "query": {
          "bool": {
            "filter": [
              {
                "range": {
                  "age": {
                    "gt": 5
                  }
                }
              },
              {
                "terms": {
                  "_id": [
                    "test@domain.com",
                    "test1@domain.com",
                    "test3@domain.com"
                  ]
                }
              }
            ],
            "should": [
              {
                "query_string": {
                  "query": "(football) OR (begineer)",
                  "default_field": "hobbiles.level"
                }
              }
            ]
          }
        }
      }
      

      【讨论】:

      • 如果我想匹配多个爱好怎么办?
      • 您可以使用 kind of query 代替匹配项。
      • 看看编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2021-12-23
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多