Поиск в Elasticsearch по нескольким полям, включая вложенные

#elasticsearch

#elasticsearch

Вопрос:

у меня есть это отображение в моем индексе elasticsearch:

 {
  "mappings": {
    "properties": {
      "title": {
        "type": "keyword"
      },
      "description": {
        "type": "text"
      },
      "content": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      },
      "completionTimeMinutes": {
        "type": "integer"
      },
      "views": {
        "type": "integer"
      },
      "questions": {
        "type": "nested",
        "properties": {
          "question": {
            "type": "keyword"
          },
          "answers": {
            "type": "keyword"
          },
          "rightAnswer": {
            "type": "integer"
          }
        }
      }
    }
  }
}
  

И у меня есть некоторые проблемы с запросами из нескольких полей. В моем случае я хочу выполнить поиск по названию, описанию, содержанию, вопросам.вопрос, вопросы.ответ.
Мой запрос, который не работает, выглядит следующим образом:

 {
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "query": "text to search i put here",
                    "type": "cross_fields",
                    "fields": [
                        "title",
                        "description",
                        "content",
                        "questions.question",
                        "questions.answers"
                    ],
                    "slop": 1
                }
            }
        }
    }
}
  

Я также пробовал {"query": { "nested": { "path": "questions", ...... , где …… находится над запросом, но если это так, я не могу выполнить поиск по названию, описанию, содержимому. Поэтому, пожалуйста, скажите мне, как выполнять запросы с нескольких вложенных уровней.

Комментарии:

1. пожалуйста, просмотрите мой ответ и дайте мне знать, была ли это ваша проблема?

Ответ №1:

Вам нужно объединить вложенные и не вложенные поисковые запросы. Обратитесь к официальной документации ES, чтобы узнать больше о запросах bool.

Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска

Индексировать данные:

 {
    "title": "a",
    "description": "a",
    "content": "b",
    "questions": [
        {
            "question": "c",
            "answers": "c"
        }
    ]
}
  

Поисковый запрос:

 {
    "query": {
        "bool": {
            "should": [
                {
                    "multi_match": {
                        "query": "a",
                        "type": "cross_fields",
                        "fields": [
                            "title",
                            "content"
                        ],
                        "slop": 1
                    }
                },
                {
                    "nested": {
                        "path": "questions",
                        "query": {
                            "multi_match": {
                                "query": "c",
                                "type": "cross_fields",
                                "fields": [
                                    "title",
                                    "content",
                                    "questions.question",
                                    "questions.answers"
                                ],
                                "slop": 1
                            }
                        }
                    }
                }
            ],
            "minimum_should_match":1
        }
    }
}
  

Результат поиска:

 "hits": [
      {
        "_index": "stof_64155263",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "title": "a",
          "description": "a",
          "content": "b",
          "questions": [
            {
              "question": "c",
              "answers": "c"
            }
          ]
        }
      }
    ]
  

Комментарии:

1. Хорошо, это работает, но не так, как я хочу. Вы можете мне помочь? Мне нужно искать одно и то же содержимое по всем полям. Например, я мог бы создать большую строку из всех полей и выполнить поиск в ней. Когда я выполняю поиск с помощью своего метода по объектам, которые имеют большую строку в поле содержимого, он работает нормально, но когда я выполняю поиск таким же образом с вашим методом, он возвращает пустой массив. Как можно объединить все значения из полей в одну большую строку и выполнять поиск только в ней?