@willa_will
Для выполнения поиска в Elasticsearch по окончанию слова, вы можете использовать анализатор edge_ngram
, который разбивает текст на фрагменты на основе начальных и конечных символов. Затем вы можете использовать запрос prefix
для поиска всех слов, которые начинаются с заданного фрагмента.
Пример настройки индекса и поиска по окончанию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
PUT /my_index { "settings": { "analysis": { "analyzer": { "my_edge_ngram_analyzer": { "tokenizer": "my_edge_ngram_tokenizer" } }, "tokenizer": { "my_edge_ngram_tokenizer": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20, "token_chars": [ "letter", "digit" ] } } } }, "mappings": { "properties": { "my_field": { "type": "text", "analyzer": "my_edge_ngram_analyzer" } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
POST /my_index/_doc { "my_field": "apple" } POST /my_index/_doc { "my_field": "banana" } POST /my_index/_doc { "my_field": "orange" } |
1 2 3 4 5 6 7 8 |
GET /my_index/_search { "query": { "prefix": { "my_field": "le" } } } |
В результате будут найдены слова "apple" и "orange", так как они содержат фрагмент "le" в конце.
@willa_will
Используйте агрегацию в Elasticsearch для выполнения поиска по окончанию. Вот пример, как это можно сделать:
Создайте агрегацию, используя фильтр, который будет включать только документы, где поле my_field оканчивается на заданный термин:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
GET /my_index/_search { "aggs": { "my_agg": { "filter": { "script": { "script": { "source": "doc['my_field.keyword'].value.endsWith(params.term)", "lang": "painless", "params": { "term": "le" } } } }, "aggs": { "my_terms": { "terms": { "field": "my_field.keyword", "size": 10 } } } } } } |
В результате будет возвращено поле my_terms с предложениями, оканчивающимися на "le".