Я думаю, что несколько недавно добавленный (v6.1) term_set query (который Val ссылается на вопрос, который он связал в своем комментарии) - это то, что вы хотите.
terms_set
, в отличие от обычного terms
, имеет параметр для указания минимального количества совпадений, которые должны существовать между поисковыми терминами и терминами, содержащимися в поле.
Дано:
PUT my_index/_doc/1
{
"values": ["living", "in a van", "down by the river"],
}
PUT my_index/_doc/2
{
"values": ["living", "in a house", "down by the river"],
}
Запрос terms
для ["living", "in a van", "down by the river"]
вернет вам оба документа: ничего хорошего.terms_set
, настроенный на требование всех трех совпадающих терминов (сценарий params.num_terms
оценивается как 3
), может дать вам только одно совпадающее:
GET my_index/_search
{
"query": {
"terms_set": {
"values": {
"terms": ["living", "in a van", "down by the river"],
"minimum_should_match_script": {
"source": "params.num_terms"
}
}
}
}
}
ПРИМЕЧАНИЕ: Хотя яиспользуется minimum_should_match_script
в приведенном выше примере, это не очень эффективный шаблон.Альтернативный minimum_should_match_field
является лучшим подходом, но использование его в примере означало бы пару дополнительных PUT для добавления необходимого поля в документы, поэтому я пошел с краткостью.