2

我有多个文档的索引。这些文件包含以下字段:

  • 姓名
  • adhar_number
  • pan_number
  • acc_number

我想创建一个 elasticsearch dsl 查询。对于此查询,有两个输入可用,例如 adhar_number 和 pan_number。此查询应与此匹配OR 条件

示例:如果一个文档仅包含提供的 adhar_number,那么我也想要该文档。

我有一本包含以下内容的字典(my_dict):

{
  "adhar_number": "123456789012",
  "pan_number": "BGPPG4315B"
}

我尝试如下:

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
s = Search(using=es, index="my_index")
for key, value in my_dict.items():
   s = s.query("match", **{key:value})

print(s.to_dict())
response = s.execute()
print(response.to_dict())

它创建以下查询:

{
  'query': {
    'bool': {
      'must': [
        {
          'match': {
            'adhar_number': '123456789012'
          }
        },
        {
          'match': {
            'pan_number': 'BGPPG4315B'
          }
        }
      ]
    }
  }
}

上面的代码为我提供了AND 条件而不是OR Condition的结果。

请向我提出包含 OR 条件的好建议。

4

2 回答 2

8

要修复 ES 查询本身,您需要做的就是使用 'should' 而不是 'must':

{
  'query': {
    'bool': {
      'should': [
        {
          'match': {
            'adhar_number': '123456789012'
          }
        },
        {
          'match': {
            'pan_number': 'BGPPG4315B'
          }
        }
      ]
    }
  }
}

要在 python 中实现这一点,请参阅文档中的以下示例。默认逻辑是 AND,但您可以将其覆盖为 OR,如下所示。

查询组合 查询对象可以使用逻辑运算符进行组合:

Q("match", title='python') | Q("match", title='django')
# {"bool": {"should": [...]}}

Q("match", title='python') & Q("match", title='django')
# {"bool": {"must": [...]}}

~Q("match", title="python")
# {"bool": {"must_not": [...]}} 

当您多次调用 .query() 方法时,将在内部使用 & 运算符:

s = s.query().query() print(s.to_dict())
# {"query": {"bool": {...}}}

如果你想对查询形式有精确的控制,使用Q快捷键直接构造组合查询:

q = Q('bool',
    must=[Q('match', title='python')],
    should=[Q(...), Q(...)],
    minimum_should_match=1 ) s = Search().query(q)

所以你想要类似的东西

q = Q('bool', should=[Q('match', **{key:value})])
于 2018-09-19T10:53:42.300 回答
0

您可以使用should@ifo20 也提到的方法。请注意,您很可能还想定义minimum_should_match参数:

您可以使用 minimum_should_match 参数指定返回的文档必须匹配的 should 子句的数量或百分比。

如果 bool 查询至少包含一个 should 子句且没有 must 或 filter 子句,则默认值为 1。否则,默认值为 0。

{
  'query': {
    'bool': {
      'should': [
        {
          'match': {
            'adhar_number': '123456789012'
          }
        },
        {
          'match': {
            'pan_number': 'BGPPG4315B'
          }
        }
      ],
      "minimum_should_match" : 1
    }
  }
}

另请注意,应该从句有助于最终得分。我不知道如何避免这种情况,但您可能不希望这成为 OR 逻辑的一部分。

于 2020-02-19T14:39:00.617 回答