首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python elasticsearch-dsl动态查询

Python elasticsearch-dsl动态查询
EN

Stack Overflow用户
提问于 2019-07-09 06:49:51
回答 1查看 3.1K关注 0票数 0

我对弹性搜索很陌生,我正在使用弹性搜索-dsl库在python中实现它。

我一直致力于动态创建查询.

例如,我可以直接做这样的事情,

代码语言:javascript
复制
q = (Q('match', age=21) | Q('match', gender='male')) & (~Q('match', name='Stevens'))

但是如何动态地进行这样的查询呢?

我试过这样的方法:

代码语言:javascript
复制
# simple json input, based on which query should be changed
json_input = {'fields': ['age', 'gender'], 'values': {'age': 21, 'gender': 'male'}}

age_query = None
gender_query = None
name_query = None

if 'age' in json_input['fields']:
    age_query = Q('match', age=json_input['values']['age'])

if 'gender' in json_input['fields']:
    gender_query = Q('match', age=json_input['values']['gender'])

if 'name' in json_input['fields']:
    name_query = ~Q('match', age=json_input['values']['name'])

q = Q()
if gender_query or age_query:
    q = (age_query | gender_query)
if name_query:
    q &= name_query

但当我执行搜索时:

代码语言:javascript
复制
s = Search(using=client, index=index)
s = s.query(q)
response = s.execute()

在执行搜索时会出现错误,

代码语言:javascript
复制
RequestError: RequestError(400, u'search_phase_execution_exception', u'failed to create query: {\n  "bool" : {\n    "should" : [\n      {\n        "match" : {\n          "age" : {\n            "query" : 21,\n            "operator" : "OR",\n            "prefix_length" : 0,\n            "max_expansions" : 50,\n            "fuzzy_transpositions" : true,\n            "lenient" : false,\n            "zero_terms_query" : "NONE",\n            "auto_generate_synonyms_phrase_query" : true,\n            "boost" : 1.0\n          }\n        }\n      },\n      {\n        "match" : {\n          "age" : {\n            "query" : "male",\n            "operator" : "OR",\n            "prefix_length" : 0,\n            "max_expansions" : 50,\n            "fuzzy_transpositions" : true,\n            "lenient" : false,\n            "zero_terms_query" : "NONE",\n            "auto_generate_synonyms_phrase_query" : true,\n            "boost" : 1.0\n          }\n        }\n      }\n    ],\n    "adjust_pure_negative" : true,\n    "boost" : 1.0\n  }\n}')

我想知道这个查询生成有什么问题,还有更合适的方法吗?

如果我执行s.to_dict(),它将生成正确的JSON,如下所示:

代码语言:javascript
复制
{'query': {'bool': {'should': [{'match': {'age': 21}},
                           {'match': {'age': 'male'}}]}}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-09 07:03:51

我认为第二个和第三个if's没有使用正确的字段:

代码语言:javascript
复制
if 'gender' in json_input['fields']:
    gender_query = Q('match', gender=json_input['values']['gender'])
                                ^
                                |
                      change this field name


if 'name' in json_input['fields']:
    name_query = ~Q('match', name=json_input['values']['name'])
                               ^
                               |
                     change this field name
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56946761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档