Теперь пришло время посмотреть, как мы можем создать свой собственный анализатор. Для этого мы определим, из каких фильтров символов, токенизаторов и фильтров лексем должен состоять анализатор, и потенциально настроим их.
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 | PUT /analyzers_test { "settings": { "analysis": { "analyzer": { "english_stop": { "type": "standard", "stopwords": "_english_" }, "my_analyzer": { "type": "custom", "tokenizer": "standard", "char_filter": [ "html_strip" ], "filter": [ "lowercase", "trim", "my_stemmer" ] } }, "filter": { "my_stemmer": { "type": "stemmer", "name": "english" } } } } } |
Приведенный выше запрос добавляет два анализатора и один фильтр лексем, который используется внутри пользовательского анализатора. Помимо пользовательского фильтра лексем используются встроенные символьные фильтры и фильтры лексем. И, конечно же, стандартный токенизатор. Список доступных вы можете найти в документации здесь.
Отлично, итак, индекс создан с нашими настройками. Давайте воспользуемся API Analyze, чтобы проверить, что анализатор работает так, как мы ожидаем.
1 2 3 4 5 | POST /analyzers_test/_analyze { "analyzer": "my_analyzer", "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": 37, "end_offset": 41, "type": "", "position": 6 }, { "token": "dry", "start_offset": 42, "end_offset": 54, "type": "", "position": 7 }, { "token": "red", "start_offset": 55, "end_offset": 58, "type": "", "position": 8 }, { "token": "wine", "start_offset": 59, "end_offset": 63, "type": "", "position": 9 } ] } |
Взглянув на результаты, мы увидим, что буква "i" в первом лексемном слове была записана в нижнем регистре. Мы также видим, что HTML-теги были удалены, а слово "drinking" было преобразовано в "drink". Отлично, анализатор работает, и теперь мы можем использовать его для сопоставления полей.