2017-02-02 5 views
0

Здесь Definiton:Как стирать апострофы?

апостроф лексемы фильтр удаляет все символы после апострофа, включая сам апостроф.

Попытка снять апострофы и персонажи после них. Когда есть только один апостроф, фильтр вообще ничего не снимает. Кроме того, когда имеется несколько последовательных апострофов, он разбивает соответствующие слова , но не снимает ничего после апострофов. Очевидно, я должен что-то упустить.

ввода с одного апострофа:

POST localhost:9200/_analyze? 
{ 
    "filter": ["apostrophe"], 
    "text": "apple banana'orange kiwi" 
} 

Выход

{ 
    "tokens": [ 
    { 
     "token": "apple", 
     "start_offset": 0, 
     "end_offset": 5, 
     "type": "<ALPHANUM>", 
     "position": 0 
    }, 
    { 
     "token": "banana'orange", 
     "start_offset": 6, 
     "end_offset": 19, 
     "type": "<ALPHANUM>", 
     "position": 1 
    }, 
    { 
     "token": "kiwi", 
     "start_offset": 20, 
     "end_offset": 24, 
     "type": "<ALPHANUM>", 
     "position": 2 
    } 
    ] 
} 

ввода с несколькими последовательными апострофы.

{ 
    "filter": ["apostrophe"], 
    "text": "apple banana''orange kiwi" 
} 

Выход

{ 
    "tokens": [ 
    { 
     "token": "apple", 
     "start_offset": 0, 
     "end_offset": 5, 
     "type": "<ALPHANUM>", 
     "position": 0 
    }, 
    { 
     "token": "banana", 
     "start_offset": 6, 
     "end_offset": 12, 
     "type": "<ALPHANUM>", 
     "position": 1 
    }, 
    { 
     "token": "orange", 
     "start_offset": 14, 
     "end_offset": 20, 
     "type": "<ALPHANUM>", 
     "position": 2 
    }, 
    { 
     "token": "kiwi", 
     "start_offset": 21, 
     "end_offset": 25, 
     "type": "<ALPHANUM>", 
     "position": 3 
    } 
    ] 
} 
+0

Извините, я вас не понял, вы хотите просто стереть апострофы? или расколоться ими и удалить их? – Mysterion

+0

Я хочу снять апостроф и персонажи после него. Обновлен вопрос. – gunererd

+0

как насчет попытки https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-replace-charfilter.html? – Mysterion

ответ

1

Если вы используете маркер фильтр самостоятельно, он не будет работать, потому что standard анализатор будет удар и разметить ввод и маркер фильтра apostrophe будет игнорироваться. Если добавить параметр explain вы получите больше информации о том, что происходит:

curl -XPOST 'localhost:9200/_analyze?pretty&filter=apostrophe&explain' -d "apple banana'orange kiwi" 
{ 
    "detail" : { 
    "custom_analyzer" : false, 
    "analyzer" : { 
     "name" : "standard", 
     "tokens" : [ { 
     "token" : "apple", 
     "start_offset" : 0, 
     "end_offset" : 5, 
     "type" : "<ALPHANUM>", 
     "position" : 0, 
     "bytes" : "[61 70 70 6c 65]", 
     "positionLength" : 1 
     }, { 
     "token" : "banana'orange", 
     "start_offset" : 6, 
     "end_offset" : 19, 
     "type" : "<ALPHANUM>", 
     "position" : 1, 
     "bytes" : "[62 61 6e 61 6e 61 27 6f 72 61 6e 67 65]", 
     "positionLength" : 1 
     }, { 
     "token" : "kiwi", 
     "start_offset" : 20, 
     "end_offset" : 24, 
     "type" : "<ALPHANUM>", 
     "position" : 2, 
     "bytes" : "[6b 69 77 69]", 
     "positionLength" : 1 
     } ] 
    } 
    } 
} 

Как вы можете видеть, как описано выше, только с помощью standard анализатора.

Чтобы исправить это, вам просто нужно указать хотя бы токенизатор. Если вы используете токенизатор standard, он работает так, как ожидалось. И вы можете видеть, что теперь у вас есть пользовательский анализатор с использованием токенизатора standard и фильтра токенов apostrophe, который теперь может выполнять свою работу должным образом.

curl -XPOST 'localhost:9200/_analyze?pretty&tokenizer=standard&filter=apostrophe&explain' -d "apple banana'orange kiwi" 
{ 
    "detail" : { 
    "custom_analyzer" : true, 
    "charfilters" : [ ], 
    "tokenizer" : { 
     "name" : "standard", 
     "tokens" : [ { 
     "token" : "apple", 
     "start_offset" : 0, 
     "end_offset" : 5, 
     "type" : "<ALPHANUM>", 
     "position" : 0, 
     "bytes" : "[61 70 70 6c 65]", 
     "positionLength" : 1 
     }, { 
     "token" : "banana'orange", 
     "start_offset" : 6, 
     "end_offset" : 19, 
     "type" : "<ALPHANUM>", 
     "position" : 1, 
     "bytes" : "[62 61 6e 61 6e 61 27 6f 72 61 6e 67 65]", 
     "positionLength" : 1 
     }, { 
     "token" : "kiwi", 
     "start_offset" : 20, 
     "end_offset" : 24, 
     "type" : "<ALPHANUM>", 
     "position" : 2, 
     "bytes" : "[6b 69 77 69]", 
     "positionLength" : 1 
     } ] 
    }, 
    "tokenfilters" : [ { 
     "name" : "apostrophe", 
     "tokens" : [ { 
     "token" : "apple", 
     "start_offset" : 0, 
     "end_offset" : 5, 
     "type" : "<ALPHANUM>", 
     "position" : 0, 
     "bytes" : "[61 70 70 6c 65]", 
     "positionLength" : 1 
     }, { 
     "token" : "banana", 
     "start_offset" : 6, 
     "end_offset" : 19, 
     "type" : "<ALPHANUM>", 
     "position" : 1, 
     "bytes" : "[62 61 6e 61 6e 61]", 
     "positionLength" : 1 
     }, { 
     "token" : "kiwi", 
     "start_offset" : 20, 
     "end_offset" : 24, 
     "type" : "<ALPHANUM>", 
     "position" : 2, 
     "bytes" : "[6b 69 77 69]", 
     "positionLength" : 1 
     } ] 
    } ] 
    } 
} 
Смежные вопросы