Elasticsearch поставляется с рядом встроенных анализаторов и фильтров лексем, некоторые из которых можно настроить с помощью параметров. В следующем примере я настрою стандартный анализатор на удаление стоп-слов, что заставит его включить фильтр стоп-лексики.
Я создам новый индекс для этой цели и определю анализатор во время создания индекса. Мы сделаем это, добавив объект настроек.
1 2 3 4 5 6 7 8 9 10 11 12 13 | PUT /existing_analyzer_config { "settings": { "analysis": { "analyzer": { "english_stop": { "type": "standard", "stopwords": "_english_" } } } } } |
Помимо английского языка, фильтр стоп-токенов поставляется с рядом других предопределенных языков.
Далее я хочу показать вам, как настроить фильтр лексем. Это делается путем добавления объекта фильтра в объект анализа. Синтаксис такой же, как и в анализаторах.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | PUT /analyzers_test { "settings": { "analysis": { "analyzer": { "english_stop": { "type": "standard", "stopwords": "_english_" } }, "filter": { "my_stemmer": { "type": "stemmer", "name": "english" } } } } } |
Выполнение приведенного выше запроса создаст индекс вместе с настроенной версией стандартного анализатора и фильтром токенов. Вы можете сделать то же самое для токенизаторов и фильтров символов, добавив ключ tokenizer и char_filter соответственно.
Теперь давайте проверим, что анализатор работает так, как мы ожидаем, используя API Analyze.
1 2 3 4 5 | POST /existing_analyzer_config/_analyze { "analyzer": "english_stop", "text": "I'm in the mood for drinking semi-dry red wine!" } |
Результат
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | { "tokens": [ { "token": "i'm", "start_offset": 0, "end_offset": 3, "type": "", "position": 0 }, { "token": "mood", "start_offset": 11, "end_offset": 15, "type": "", "position": 3 }, { "token": "drinking", "start_offset": 20, "end_offset": 28, "type": "", "position": 5 }, { "token": "semi", "start_offset": 29, "end_offset": 33, "type": "", "position": 6 }, { "token": "dry", "start_offset": 34, "end_offset": 37, "type": "", "position": 7 }, { "token": "red", "start_offset": 38, "end_offset": 41, "type": "", "position": 8 }, { "token": "wine", "start_offset": 42, "end_offset": 46, "type": "", "position": 9 } ] } |
Как видно из результатов, стоп-слова действительно были отфильтрованы, так что все выглядит хорошо.
Давайте проверим, что фильтр лексем также работает, как задумано.
1 2 3 4 5 6 | POST /analyzers_test/_analyze { "tokenizer": "standard", "filter": [ "my_stemmer" ], "text": "I'm in the mood for drinking semi-dry red wine!" } |
Результат
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | { "tokens": [ { "token": "I'm", "start_offset": 0, "end_offset": 3, "type": "", "position": 0 }, { "token": "in", "start_offset": 4, "end_offset": 6, "type": "", "position": 1 }, { "token": "the", "start_offset": 7, "end_offset": 10, "type": "", "position": 2 }, { "token": "mood", "start_offset": 11, "end_offset": 15, "type": "", "position": 3 }, { "token": "for", "start_offset": 16, "end_offset": 19, "type": "", "position": 4 }, { "token": "drink", "start_offset": 20, "end_offset": 28, "type": "", "position": 5 }, { "token": "semi", "start_offset": 29, "end_offset": 33, "type": "", "position": 6 }, { "token": "dry", "start_offset": 34, "end_offset": 37, "type": "", "position": 7 }, { "token": "red", "start_offset": 38, "end_offset": 41, "type": "", "position": 8 }, { "token": "wine", "start_offset": 42, "end_offset": 46, "type": "", "position": 9 } ] } |
Как мы видим в результатах, слово "drinking" было стеммировано до "drink", поэтому фильтр лексем работает.
Вот так можно настроить встроенные анализаторы, фильтры лексем и многое другое.