Поддерживает ли Elasticsearch вложенные или объектные поля в MultiMatch?

У меня есть поле объекта с именем «FullTitleFts». Внутри есть поле "текст". Этот запрос отлично работает (и возвращает некоторые записи):

GET index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fullTitleFts.text": "Ivan"
          }
        }
      ]
    }
  }
}

Но этот запрос ничего не возвращает:

GET index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "Ivan",
            "fields": [
              "fullTitleFts.text"
            ]
          }
        }
      ]
    }
  }
}

Картографирование поля:

"fullTitleFts": {
    "copy_to": [
        "text"
    ],
    "type": "keyword",
    "fields": {
        "text": {
            "analyzer": "analyzer",
            "term_vector": "with_positions_offsets_payloads",
            "type": "text"
        }
    }
}


"analyzer": {
    "filter": [
        "lowercase",
        "hypocorisms",
        "protect_kw"
    ],
    "char_filter": [
        "replace_char_filter",
        "e_char_filter"
    ],
    "expand": "true",
    "type": "custom",
    "tokenizer": "standard"
}  

e_char_filter — для замены кириллической буквы «ё» на «е», replace_char_filter — для удаления «�» из текста. Protect_kw является ключевым словом для некоторых русских союзов. лицемерие - это synonym_graph для создания других форм имен.

Пример вывода анализатора:

GET index/_analyze
{
  "analyzer": "analyzer",
  "text":     "Алёна�"
}

{
  "tokens" : [
    {
      "token" : "аленка",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "аленушка",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "алена",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

Я также нашел этот вопрос. И кажется, что ответ на самом деле не сработал - автору пришлось добавить опцию «include_in_root» в сопоставлении. Поэтому мне интересно, поддерживает ли множественное совпадение вложенные или объектные поля вообще. Я также не могу найти ничего об этом в документах.

не могли бы вы поместить всю карту, которая также покажет определение analyzer.

Sagar Patel 22.03.2022 08:12

в соответствии с вашим сопоставлением индекса ваше поле fullTitleFts определяется как многопрофильный, а не как вложенное или объектное поле.

Sagar Patel 22.03.2022 08:17

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

DenisNovac 22.03.2022 08:37

Вы правильно делаете запрос с несколькими полями. У меня есть индексный документ с одним и тем же текстом, который может получить результат, используя как запрос соответствия, так и запрос с несколькими совпадениями. не могли бы вы опубликовать полное сопоставление индекса с анализатором и токенизатором, а также определение фильтра. это будет здорово полезно.

Sagar Patel 22.03.2022 08:49

Довольно сложно дать полное определение, так как для некоторых из них есть большие файлы конфигурации. Поможет ли показать вывод анализатора? Я добавил это к вопросу. И я не могу запросить какое-либо мультиполе в моем индексе при множественном совпадении. Я использую Elastic 6.8, если это имеет значение.

DenisNovac 22.03.2022 09:19

О, я узнал причину, я использовал неправильный индекс. Извините за введение в заблуждение. буду голосовать за закрытие

DenisNovac 22.03.2022 09:29

здорово слышать об этом. я также опубликовал то же объяснение, что и ответ.

Sagar Patel 22.03.2022 10:04
0
7
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы предоставили сопоставление индекса, ваше поле определено как многопрофильный, а не как вложенное или объектное поле. Таким образом, и match, и multi_match должны работать без предоставления path. вы можете просто использовать имя поля как fullTitleFts.text, когда нужно искать по типу текста, и fullTitleFts, когда нужно искать по типу ключевого слова.

Другие вопросы по теме