Ограничить результат поиска совпадениями нескольких полей в ElasticSearch

#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. Нет, я устал и пропустил тему. Следующий ответ правильный ;).