Elasticsearch dsl ИЛИ формирование запроса - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть индекс с несколькими документами.Документы содержат следующие поля:

  • name
  • adhar_number
  • pan_number
  • acc_number

Я хочу создатьDlas-запрос Elassearch.Для этого запроса доступны два входа, такие как adhar_number и pan_number.Этот запрос должен соответствовать ИЛИ Условие для этого.

Пример: если один документ содержит только 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'
          }
        }
      ]
    }
  }
}

Приведенный выше код дает мне результат с И условием вместо ИЛИ Условием .

Пожалуйста, предложите мне хорошие предложения, чтобы включить ИЛИ Условие.

1 Ответ

0 голосов
/ 19 сентября 2018

Чтобы исправить сам запрос ES, все, что вам нужно сделать, это использовать «must» вместо «must»:

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

Чтобы добиться этого в python, см. Следующий пример из документы .Логика по умолчанию - И, но вы можете переопределить ее на ИЛИ, как показано ниже.

Комбинация запросов Объекты запроса могут быть объединены с использованием логических операторов:

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})])
...