Как сделать логическое ИЛИ двух запросов Elasticsearch с использованием Python - PullRequest
0 голосов
/ 03 октября 2018

У меня есть этот python код, где я выполняю два Elasticsearch запроса отдельно:

def search_es_phrase():


    es = Elasticsearch([{'host': str(es_host), 'port': int(es_port)}])

    data = {
        "query": {
            "function_score": {

                "query": {

                    "multi_match": {
                        "type": "phrase",
                        "query": "Who am I?",
                        "fields": ["q"]

                    }
                },

                "field_value_factor": {
                    "field": "votes",
                    "modifier": "log2p"
                }

            }
        }
    }
    response = es.search(index=str(index_name).lower(), body=data)
    score_answer = []
    for items in response['hits']['hits']:
        score = items['_score']
        source = items['_source']
        id = items['_id']
        answer = source['a']

        score_answer.append([score,id, source, answer])
    return score_answer



def search_es_best_fields():


    es = Elasticsearch([{'host': str(es_host), 'port': int(es_port)}])

    data = {
        "query": {
            "function_score": {

                "query": {

                    "multi_match": {
                        "type": "best_fields",
                        "query": "Who am I?",
                        "fields": ["q"]

                    }
                },

                "field_value_factor": {
                    "field": "votes",
                    "modifier": "log2p"
                }

            }
        }
    }
    response = es.search(index=str(index_name).lower(), body=data)

    score_answer = []
    for items in response['hits']['hits']:
        score = items['_score']
        source = items['_source']
        id = items['_id']
        answer = source['a']

        score_answer.append([score,id, source, answer])
    return score_answer

 if __name__ == '__main__':
    es_response = search_es_phrase() # Run phrase ES query
    if not es_response:
       es_response = search_es_best_fields() # Run best_fields
    print(es_response)

Как вы можете видеть, в настоящее время я выполняю phrase Elasticsearchзапрос, и если он возвращает пустой response (т.е. не соответствует фразе), то я выполняю запрос best_fields.Обратите внимание, что запрос best_fields выполняется только в том случае, если запрос phrase match ничего не возвращает.

Поскольку в настоящее время я выполняю два отдельных запроса ES, я хотел проверить, могу ли я объединить два вышеупомянутых запроса - phrase и best_fields в один запрос ES.Таким образом, одна ES функция запроса для data, которая объединяет оба запроса и выполняет 2-й запрос (best_fields запрос), только если 1-й запрос (phrase запрос) не возвращает совпадения.

Я заметил, что в Elasticsearch есть запрос bool , но я не могу понять, может ли он соответствовать моим требованиям, и если да, то как я могу это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...