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
фильтр токенов и, следовательно, игнорируется.