Elastic Search игнорирует `token_chars`

Я использую Elastic Search 1.7.1 на Mac.

Вот мое отображение индекса:

{
   "settings":{
      "analysis":{
         "filter":{
            "my_edgengram":{
               "max_gram":15,
               "token_chars":[
                  "letter",
                  "digit"
               ],
               "type":"edgeNGram",
               "min_gram":1
            },
         },
         "analyzer":{
            "stop_edgengram_analyzer":{
               "filter":[
                  "lowercase",
                  "asciifolding",
                  "stop",
                  "my_edgengram"
               ],
               "type":"custom",
               "tokenizer":"whitespace"
            }
         }
      }
   }
}

Анализатор отладки:

$ curl -XGET 'http://localhost:9200/objects/_analyze?analyzer=stop_edgengram_analyzer&text=America,s&pretty=True'
{
  "tokens" : [
     ... skipped ...
  , {
    "token" : "america",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "america,",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "america,s",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "word",
    "position" : 1
  } ]
}

Зачем america,s токен находится в выводе?

, является символом пунктуации. Я ожидаю буквы и цифры только так, как указано в свойстве token_chars my_edgengram фильтр.

1 ответ

Решение

Вы путаете токенайзер edge_ngram и фильтр токенов edge_ngram.

Из документации:

Токенайзеры используются для разбиения строки на поток терминов или токенов.

В приведенном примере whitespace это токенизатор, который используется

Token Filter с другой стороны:

принимать поток токенов от токенизатора и может изменять токены (например, нижний регистр), удалять токены (например, удалять стоп-слова) или добавлять токены (например, синонимы).

В примере, представленном в ОП egde_ngram фильтр токенов используется.

token_chars не поддерживается для edge_ngram фильтр токенов и, следовательно, игнорируется.

Другие вопросы по тегам