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

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

Это возвращает мое имя, когда я использую частичное совпадение:

GET /_search?pretty=true
{ 
    "query": {
        "match": {
            "FullName": "andon"
        }
    }
}

Этот поиск выполняется во всех полях, но не выполняет частичное совпадение (0 обращений):

GET /_search?pretty=true
{
    "query": {
        "match": {
           "_all": "andon"
        }
    }
}

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

Если это имеет значение, я вставляю свои данные из Реки, которая подключается к SQL.

EDIT: Теперь у меня есть поле _all в моем отображении. Кажется, не имеет значения.

PUT /contact/
{
    "settings" : {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "my_ngram_analyzer" : {
                        "tokenizer" : "my_ngram_tokenizer"
                    }
                },
                "tokenizer" : {
                    "my_ngram_tokenizer" : {
                        "type" : "nGram",
                        "min_gram" : "1",
                        "max_gram" : "10"
                    }
                }
            }
        }
    },
    "mappings": {
        "_default_": {
            "_all" : {"enabled" : true},
            "properties" : {
                "Description":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "OfficePhone":{"type":"string","store":"yes"},
                "Email":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "FullName":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "ReportsTo":{"type":"string","store":"yes"},
                "Department":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "Title":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}
            }
        }
    }
}

Ответ 1

_all -field работает, беря текст для всех полей, передавая их через анализатор для _all (который standard, если не переопределен), затем проиндексируем полученные члены.

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

Таким образом, вы должны переопределить поле _all, чтобы использовать свой собственный анализатор.

Но! Я не думаю, что ты действительно хочешь это сделать. Вы получите гораздо больший индекс. Имея _all удобно время от времени, но обычно лучше контролировать, какие поля ищутся в момент поиска.

Поэтому вместо того, чтобы делать match on _all, вы, вероятно, захотите использовать multi_match, указав свои поля. Вы также можете рассмотреть copy_to, если вы в 1.0.

Ответ 2

Я попробовал поиск с подстановочными знаками (% 2A) и смог выполнить частичный поиск

ex = > ? q = chew% 2A & size = 100