У меня есть поле объекта с именем «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» в сопоставлении. Поэтому мне интересно, поддерживает ли множественное совпадение вложенные или объектные поля вообще. Я также не могу найти ничего об этом в документах.
в соответствии с вашим сопоставлением индекса ваше поле fullTitleFts определяется как многопрофильный, а не как вложенное или объектное поле.
Я добавил определение анализатора, но, поскольку он работает в простом запросе на совпадение, я не понимаю, почему он может быть другим для multi_match. Но как мне запросить несколько полей? Кажется, это работает в соответствии, как и в полях объектов.
Вы правильно делаете запрос с несколькими полями. У меня есть индексный документ с одним и тем же текстом, который может получить результат, используя как запрос соответствия, так и запрос с несколькими совпадениями. не могли бы вы опубликовать полное сопоставление индекса с анализатором и токенизатором, а также определение фильтра. это будет здорово полезно.
Довольно сложно дать полное определение, так как для некоторых из них есть большие файлы конфигурации. Поможет ли показать вывод анализатора? Я добавил это к вопросу. И я не могу запросить какое-либо мультиполе в моем индексе при множественном совпадении. Я использую Elastic 6.8, если это имеет значение.
О, я узнал причину, я использовал неправильный индекс. Извините за введение в заблуждение. буду голосовать за закрытие
здорово слышать об этом. я также опубликовал то же объяснение, что и ответ.
Поскольку вы предоставили сопоставление индекса, ваше поле определено как многопрофильный, а не как вложенное или объектное поле. Таким образом, и match, и multi_match должны работать без предоставления path. вы можете просто использовать имя поля как fullTitleFts.text, когда нужно искать по типу текста, и fullTitleFts, когда нужно искать по типу ключевого слова.
не могли бы вы поместить всю карту, которая также покажет определение
analyzer.