Elasticsearch查询格式

mzmfm0qo  于 7个月前  发布在  ElasticSearch
关注(0)|答案(2)|浏览(66)

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

  • 名称
  • 阿达尔数
  • 盘数
  • acc_number

我想创建一个elasticsearch查询。对于这个查询,有两个输入可用,如adhar_number和pan_number。这个查询应该匹配OR Condition
示例:如果一个文档只包含提供的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条件提供给我的结果。
请给我一些好的建议,包括或条件。

piok6c0g

piok6c0g1#

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

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

字符串
要在python中实现这一点,请参见下面的the docs示例。默认逻辑是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})])

628mspwn

628mspwn2#

您可以使用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
    }
  }
}

字符串
还需要注意的是,should子句对最终得分有影响,我不知道如何避免,但你可能不希望这成为OR逻辑的一部分。

相关问题