У меня есть этот 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 , но я не могу понять, может ли он соответствовать моим требованиям, и если да, то как я могу это сделать.