#elasticsearch
#elasticsearch
Вопрос:
Я пытаюсь ограничить результат поиска несколькими поисковыми словами в разных полях документа.
Например, у меня есть 3 поля field1
, field2
и field3
и два слова для поиска word1
и word2
. Я хотел бы иметь все документы с любыми двумя полями, соответствующими этим словам по отдельности, например:
field1
совпаденияword1
иfield3
совпаденияword2
, илиfield2
совпаденияword1
иfield3
совпаденияword2
, илиfield1
совпаденияword2
иfield2
совпаденияword1
, или- … …
Как я должен написать запрос?
Кстати. Я использую ElasticSearch 5.x.
Ответ №1:
Я думаю, что это должно сработать:
{
"query": {
"bool": {
"must": [{
"multi_match": {
"query": "word1",
"fields": ["field1", "field2", "field3"]
}
},
{
"multi_match": {
"query": "word2",
"fields": ["field1", "field2", "field3"]
}
}
]
}
}
}
Комментарии:
1. Большое вам спасибо. Возможно ли тогда, чтобы он автоматически разбирал слова и добавлял
multi_match
запросы. Например, если я указал 3 слова для поиска вместо 2, будет ли фактически добавлено другоеmulti_match
?2. Да, вам просто нужны дополнительные записи multi_match, но я не думаю, что elastic может сделать это за вас — вам нужно будет заранее создать запрос в клиентском приложении.
Ответ №2:
Пожалуйста, прочитайте документацию:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{"term": {"field1 ": "word1"}},
{"term": {"field3 ": "word2"}}
]
}
},
{
"bool": {
"must": [
{"term": {"field2 ": "word1"}},
{"term": {"field3 ": "word2"}}
]
}
},
{
"bool": {
"must": [
{"term": {"field1 ": "word2"}},
{"term": {"field2 ": "word1"}}
]
}
}
]
}
}
}
Комментарии:
1. Извините, это не отвечает на мой вопрос. Запрос должен соответствовать ЛЮБОМУ из 2 полей. 3 маркированных пункта — это просто примеры. Должен ли я писать все комбинации в запросе?
2. Нет, я устал и пропустил тему. Следующий ответ правильный ;).