2015-08-20 1 views
2

Я использую Elastic Search 1.7.1 на Mac.Упругий поиск игнорируется `token_chars`

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

{ 
    "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" 
      } 
     } 
     } 
    } 
} 

Debugging анализатор:

$ 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.

ответ

2

Вы сбиваете с толку edge_ngram tokenizer и edge_ngram token filter.

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

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

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

маркеров Фильтр с другой стороны:

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

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

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