Elasticsearch с запросом вложенных объектов - PullRequest
0 голосов
/ 23 декабря 2018

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

Вот индекс:

properties: {
      column_values_index_as_objects: {
        type: "nested",
        properties: {
          value: {
            ignore_above: 256,
            type: 'keyword',
            fields: {
              word_middle: {
                analyzer: "searchkick_word_middle_index",
                type: "text"
              },
              analyzed: {
                term_vector: "with_positions_offsets",
                type: "text"
              }
            }
          }
        }
      }
    }

Вот последний запрос, который я пробую:

nested: {
       path: "column_values_index_as_objects",
       query: {
          bool: {
             must: [
                {
                   match: {
                       "column_values_index_as_objects.value.analyzed": {
                       query: search_term,
                       boost: 10 * boost_factor,
                       operator: "or",
                       analyzer: "searchkick_search"
                      }
                   }
                }

Например, если я ищу слова «еда и вода», я хочу, чтобы каждое слово появилось хотя бы во вложенном документе.Текущий поиск возвращает документ, даже если существует только одно из слов

Спасибо за помощь!

Обновление: Как предположил Кристоф, решение работает.Теперь у меня есть следующая проблема.

Вот мой индекс:

  properties: {
      name: {
        type: "text"
      },
      column_values_index_as_objects: {
        type: "nested",
        properties: {
          value: {
            ignore_above: 256,
            type: 'keyword',
            fields: {
              word_middle: {
                analyzer: "searchkick_word_middle_index",
                type: "text"
              },
              analyzed: {
                term_vector: "with_positions_offsets",
                type: "text"
              }
            }
          }
        }
      }
    }

И запрос, который я хочу выполнить, - это если я ищу «меня зовут парень» и выдаст вседокументы, в которых найдены все слова - могут быть во вложенных документах и ​​могут находиться в поле имени.Например, у меня может быть документ со значением «парень» в поле имени и другие слова во вложенных документах

1 Ответ

0 голосов
/ 24 декабря 2018

Для этого я обычно делю термины и генерирую запрос следующим образом (foo: bar - это другой критерий для другого поля):

{
  "bool": {
    "must": [
      {
        "nested": {
          "path": "column_values_index_as_objects",
          "query": {
            "match": {
              "column_values_index_as_objects.value.analyzed": {
                "query": "food",
                "boost": "10 * boost_factor",
                "analyzer": "searchkick_search"
              }
            }
          }
        }
      },
      {
        "nested": {
          "path": "column_values_index_as_objects",
          "query": {
            "match": {
              "column_values_index_as_objects.value.analyzed": {
                "query": "and",
                "boost": "10 * boost_factor",
                "analyzer": "searchkick_search"
              }
            }
          }
        }
      },
      {
        "nested": {
          "path": "column_values_index_as_objects",
          "query": {
            "match": {
              "column_values_index_as_objects.value.analyzed": {
                "query": "water",
                "boost": "10 * boost_factor",
                "analyzer": "searchkick_search"
              }
            }
          }
        }
      },
      {
        "query": {
          "term": {
            "foo": "bar"
          }
        }
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...