Match_phrase_prefix
Возвращает документы, содержащие слова предоставленного текста, в том же порядке, что и предоставленный. Последний термин предоставленного текста обрабатывается как префикс, соответствующий любым словам, начинающимся с этого термина.
Таким образом, "Nik shoe Mi c Jord" будет выполнять поиск по фразе только для Jord и токенов также должен появиться в том же порядке.
Для поиска фразы по всем токенам используйте edge n грамм
Токенайзер edge_ngram сначала разбивает текст на слова всякий раз, когда встречается с одним из списка указанных символов затем он генерирует N-граммы каждого слова, где начало N-граммы привязано к началу слова.
Отображение
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 2, --> size of tokens
"max_gram": 10,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"title":{
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
Документы:
[
{
"_index" : "index80",
"_type" : "_doc",
"_id" : "6RTKTXEBLqTvxU9z8bl3",
"_score" : 1.0,
"_source" : {
"title" : "Nike shoes are worn by Michael Jordan"
}
},
{
"_index" : "index80",
"_type" : "_doc",
"_id" : "6hTLTXEBLqTvxU9zIrks",
"_score" : 1.0,
"_source" : {
"title" : "Michael Jordan wears shoes from Nike"
}
},
{
"_index" : "index80",
"_type" : "_doc",
"_id" : "6xTLTXEBLqTvxU9zQbm4",
"_score" : 1.0,
"_source" : {
"title" : "Mike Jordan"
}
},
{
"_index" : "index80",
"_type" : "_doc",
"_id" : "7BTLTXEBLqTvxU9zbLkT",
"_score" : 1.0,
"_source" : {
"title" : "Nike is owned by Michael Jordan"
}
}
]
Запрос:
{
"query": {
"match": {
"title": {
"query": "Nik shoe Mic Jord",
"operator": "and" --> all tokens are needed
}
}
}
}
Результат:
[
{
"_index" : "index80",
"_type" : "_doc",
"_id" : "6RTKTXEBLqTvxU9z8bl3",
"_score" : 3.2434955,
"_source" : {
"title" : "Nike shoes are worn by Michael Jordan"
}
},
{
"_index" : "index80",
"_type" : "_doc",
"_id" : "6hTLTXEBLqTvxU9zIrks",
"_score" : 3.1820722,
"_source" : {
"title" : "Michael Jordan wears shoes from Nike"
}
}
]
Для слова "майкл" с min-грамма: 2 и max-грамм: 5 генерируются следующие токены
{
"token" : "Mi",
"start_offset" : 23,
"end_offset" : 25,
"type" : "word",
"position" : 13
},
{
"token" : "Mic",
"start_offset" : 23,
"end_offset" : 26,
"type" : "word",
"position" : 14
},
{
"token" : "Mich",
"start_offset" : 23,
"end_offset" : 27,
"type" : "word",
"position" : 15
},
{
"token" : "Micha",
"start_offset" : 23,
"end_offset" : 28,
"type" : "word",
"position" : 16
},
{
"token" : "Michae",
"start_offset" : 23,
"end_offset" : 29,
"type" : "word",
"position" : 17
},
{
"token" : "Michael",
"start_offset" : 23,
"end_offset" : 30,
"type" : "word",
"position" : 18
}
размер токена от 2 до 5 слов, поэтому важен выбор минимального и максимального грамма. Большая разница приведет к тому, что ваш индекс будет раздут, а небольшая разница может привести к тому, что документы не будут соответствовать