Можем ли мы применить char_filter к пользовательскому токенизатору вasticsearch? - PullRequest
0 голосов
/ 06 марта 2019

Я настроил собственный анализатор в Elasticsearch, который использует токенайзер edge-ngram, и я экспериментирую с фильтрами и char_filters, чтобы усовершенствовать процесс поиска.

Мне указали на отличный инструмент elyser , который позволяет вам тестировать влияние, которое ваш пользовательский анализатор оказывает на определенный термин, но это выдает ошибки, когда я объединяю пользовательский анализатор с char_filter, в частности, html_strip.

Ошибка, которую я получаю отelyser:

invalid_argument_exception ',' reason ':' Пользовательский нормализатор может не использовать фильтр символов [html_strip] '

Я хотел бы знать, является ли это допустимымсообщение об ошибке или является ли это ошибкой в ​​инструменте.

Я ссылался на основную документацию и даже на их custom анализатор пример выдает ошибку в elyser:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom", 
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

Команда в elyser:

elyzer --es "http://localhost:9200" --index my_index --analyzer my_custom_analyzer "Trinity Chapel <h1>[in fact King's Chapel]</h1>"

Если окажется, что виноват elyser, может кто-нибудь указать мне альтернативный метод экзаменавводить токены, полученные из моего пользовательского анализатора, чтобы я мог проверить влияние каждого фильтра?

Мои пользовательские анализаторы выглядят так, будто я бросил в них раковину, и я хотел бы получить способтест и рефакторинг:

PUT /objects
{
  "settings" : {
    "index" : {
      "number_of_shards" : "5",
      "analysis" : {
        "analyzer" : {
          "search_autocomplete": {
            "type": "custom",
            "tokenizer": "standard",
            "char_filter" : [
              "html_strip"
            ],
            "filter": [
              "standard",
              "apostrophe",
              "lowercase",
              "asciifolding",
              "english_stop",
              "english_stemmer"
          ] 
          },
          "autocomplete": {
            "type": "custom",
            "tokenizer": "autocomplete",
            "filter": [
                "standard",
                "lowercase",
                "asciifolding",
                "english_stop",
                "english_stemmer"
            ]
          },
          "title_html_strip" : {
            "filter" : [
              "standard",
              "lowercase"
            ],
            "char_filter" : [
              "html_strip"
            ],
            "type" : "custom",
            "tokenizer" : "standard"
          }
        },
        "tokenizer": {
          "autocomplete": {
            "type": "edge_ngram",
            "min_gram": 3,
            "max_gram": 20,
            "token_chars": [
              "letter",
              "digit"
            ]
          }
        },
        "filter": {
          "english_stop": {
            "type": "stop",
            "stopwords": "_english_"
          },
          "english_stemmer": {
            "type": "stemmer",
            "name": "english"
          }
        }
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Альтернативный метод проверки токенов, созданных моими пользовательскими анализаторами:

Официальная документация включает раздел об использовании _analyse метода , который вместе с флагом объяснения: истина дает мнеинформация, которая мне нужна для проверки моих пользовательских анализаторов.

Ниже выводятся токены на каждом этапе фильтрации

GET objects/_analyze
{
  "analyzer" : "search_autocomplete",
  "explain" : true,
  "text" : "Trinity Chapel [in fact <h1>King's Chapel</h1>]"
}
1 голос
/ 06 марта 2019

Эта ошибка в Elyzer.Чтобы показать состояние токенов на каждом этапе процесса анализа, elyzer выполняет запрос анализа для каждого этапа: сначала фильтры символов , затем токенизатор и, наконец, фильтры токенов .

Проблема заключается в том, что на стороне ES процесс анализа изменился с тех пор, как были введены нормализаторы (без обратной совместимости). Они предполагают , что если в запросе нет нормализатора, анализатора и токенизатора, а только токен-фильтр или char_filter, то запрос анализа должен вести себя как нормализатор.

В вашемВ этом случае elyzer сначала выполнит запрос на символьный фильтр html_strip, а ES подумает, что речь идет о нормализаторе, поэтому ошибка, которую вы получаете , поскольку html_strip не является действительным char_filter длянормализаторы.

Поскольку я довольно хорошо знаю разработчика Elyzer (Даг Тернбулл), поэтому я уже сообщил об ошибке .Посмотрим, что развернется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...