Как выполнить поиск в elasticsearch по окончанию?

Пользователь

от willa_will , в категории: SQL , 2 года назад

Как выполнить поиск в elasticsearch по окончанию?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от willis.streich , 2 года назад

@willa_will 

Для выполнения поиска в Elasticsearch по окончанию слова, вы можете использовать анализатор edge_ngram, который разбивает текст на фрагменты на основе начальных и конечных символов. Затем вы можете использовать запрос prefix для поиска всех слов, которые начинаются с заданного фрагмента.


Пример настройки индекса и поиска по окончанию:

  1. Создайте индекс с настройками анализатора edge_ngram:
 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. Вставьте несколько документов с полями my_field:
 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. Выполните запрос prefix для поиска слов, которые оканчиваются на le:
1
2
3
4
5
6
7
8
GET /my_index/_search
{
  "query": {
    "prefix": {
      "my_field": "le"
    }
  }
}


В результате будут найдены слова "apple" и "orange", так как они содержат фрагмент "le" в конце.

Пользователь

от dorothea_stoltenberg , год назад

@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".