Прошу прощения, я забыл упомянуть,
Ну вот, началось Подсветка происходит по позициям. Поэтому для того, чтобы подсвечивать часть термина, эта часть должна иметь свою собственную позицию. Этого можно добиться, поместив используя ngram токенизатор, но поскольку поиск по фразам тоже использует позиции, он поломается. Так что, если нужно искать по фразам, то можно искать как показано выше, а подсвечивать по полю индексированному вот так:
PUT test
{
"settings": {
"number_of_shards": 1,
"analysis": {
"normalizer": {
"lowercase": {
"type": "custom",
"filter": "lowercase"
}
},
"char_filter": {
"digit_after": {
"type": "pattern_replace",
"pattern": "(\\D)(\\d)",
"replacement": "$1 $2"
},
"digit_before": {
"type": "pattern_replace",
"pattern": "(\\d)(\\D)",
"replacement": "$1 $2"
},
"char_mapping": {
"type": "mapping",
"mappings": [
"Ё => Е",
"ё => е"
]
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 50,
"token_chars": [
"letter",
"digit"
]
}
},
"filter": {
"my_word_delimiter_search": {
"type": "word_delimiter_graph",
"preserve_original": false
}
},
"analyzer": {
"my_index": {
"type": "custom",
"char_filter": [
"html_strip",
"char_mapping",
"digit_before",
"digit_after"
],
"tokenizer": "my_ngram_tokenizer",
"filter": [
"lowercase"
]
},
"my_search": {
"type": "custom",
"char_filter": [
"char_mapping"
],
"tokenizer": "whitespace",
"filter": [
"lowercase",
"my_word_delimiter_search"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "keyword",
"normalizer": "lowercase",
"fields": {
"ngram": {
"type": "text",
"analyzer": "my_index",
"search_analyzer": "my_search"
}
}
}
}
}
}
}