我有多个文件的索引。文件包含以下字段:
- 名称
- 阿达尔数
- 盘数
- 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条件提供给我的结果。
请给我一些好的建议,包括或条件。
2条答案
按热度按时间piok6c0g1#
要修复ES查询本身,您需要做的就是使用'should'而不是'must':
字符串
要在python中实现这一点,请参见下面的the docs示例。默认逻辑是AND,但您可以将其重写为OR,如下所示。
查询组合查询对象可以使用逻辑运算符组合:
型
当您多次调用.query()方法时,&运算符将在内部使用:
型
如果你想对查询表单进行精确的控制,可以使用Q快捷方式直接构造组合查询:
型
所以你想要的是
型
628mspwn2#
您可以使用
should
,正如@ifo20所提到的。请注意,您很可能也不想定义minimum_should_match
参数:可以使用minimum_should_match参数指定返回文档必须匹配的should子句的数量或百分比。
如果bool查询至少包含一个should子句,而没有must或filter子句,则默认值为1。否则,默认值为0。
字符串
还需要注意的是,should子句对最终得分有影响,我不知道如何避免,但你可能不希望这成为OR逻辑的一部分。