【问题标题】:Elasticsearch query to match on one field but should filter results based on an other fieldElasticsearch 查询匹配一个字段,但应根据另一个字段过滤结果
【发布时间】:2021-10-29 23:53:07
【问题描述】:

寻求帮助为以下用例制定查询。我有一个文本字段和一个作为 ID 的整数字段。我需要搜索匹配的文本,但希望响应包含与其中一个 ID 匹配的结果。例如,我有两个字段。一个是产品 ID,它是文本。以及一个整数的所有者 ID。必须允许所有者仅查看他们拥有的产品。此外,所有者可以有多个 ID。

Elasticsearch 中的示例记录:

{
  "product": "MKL89ADH12",
  "ownerId" : 98765
},
{
  "product": "POIUD780H",
  "ownerId" : 12345
},
{
  "product": "UJK87TG89",
  "ownerId" : 98765
},
{
  "product": "897596YHJ",
  "ownerId" : 98765
},
{
  "product": "LKGGN764HH",
  "ownerId" : 784512
}

如果 98765 和 12345 属于同一所有者,他们应该只能查看前 4 个产品。如果他们搜索LKGGN764HH ,则不应返回任何结果。

我尝试了以下查询,但没有给出任何结果。

{
  "size": 24,
  "query": {
    "bool": {
        "must":[{
          "match" : {
              "product": {
                "query": "MKL89ADH12"
              }
            }
        },
        {
          "match" : {
              "product": {
                "query": "LKGGN764HH"
              }
            }
        },
        {
          "terms": {
          "ownerId": [98765, 12345],
          "boost": 1.0
          }
        }
        ]
    }
  }
}

我希望响应包含 MKL89ADH12,因为我正在按 ownerId 进行过滤。寻求帮助为我的用例制定正确的查询。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您需要过滤 "ownerId": [98765, 12345] 然后使用 "should" 子句返回匹配任何文本的文档。

    {
      "size": 24,
      "query": {
        "bool": {
          "filter": [
            {
              "terms": {
                "ownerId": [
                  98765,
                  12345
                ],
                "boost": 1
              }
            }
          ],
          "should": [
            {
              "match": {
                "product": {
                  "query": "MKL89ADH12"
                }
              }
            },
            {
              "match": {
                "product": {
                  "query": "LKGGN764HH"
                }
              }
            }
          ],
          "minimum_should_match": 1
        }
      }
    }
    

    以上查询将转换为

    select * from index 
    where  ownerid in ( 98765, 12345)
    AND (product IN ("MKL89ADH12","LKGGN764HH))
    

    而你的作品喜欢

    select * from index 
    where  ownerid in ( 98765, 12345)
    AND product = "MKL89ADH12"
    AND product = "LKGGN764HH"
    

    【讨论】:

    • 成功了!非常感谢。
    猜你喜欢
    • 2016-07-20
    • 2019-03-22
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多