2017-02-20 4 views
0

Я хочу, чтобы удалить запятые внутри номера взять, например, «Warhammer 40000: Dawn войны III»ElasticSearch запятой внутри числа

Я хочу, чтобы соответствовать, если и искать «40000».

Но в настоящее время мой токенизатор дает мне:

{ 
"tokens": [ 
{ 
"token": "warhammer", 
"start_offset": 0, 
"end_offset": 9, 
"type": "word", 
"position": 0 
}, 
{ 
"token": "warhammer 40", 
"start_offset": 0, 
"end_offset": 12, 
"type": "shingle", 
"position": 0 
}, 
{ 
"token": "40", 
"start_offset": 10, 
"end_offset": 12, 
"type": "word", 
"position": 1 
}, 
{ 
"token": "000:", 
"start_offset": 13, 
"end_offset": 17, 
"type": "word", 
"position": 102 
}, 
{ 
"token": "000: 000", 
"start_offset": 13, 
"end_offset": 16, 
"type": "shingle", 
"position": 102 
}, 
{ 
"token": "000: 000 dawn", 
"start_offset": 13, 
"end_offset": 22, 
"type": "shingle", 
"position": 102 
}, 
{ 
"token": "000: 000 dawn of", 
"start_offset": 13, 
"end_offset": 25, 
"type": "shingle", 
"position": 102 
}, 
{ 
"token": "000: 000 dawn of war", 
"start_offset": 13, 
"end_offset": 29, 
"type": "shingle", 
"position": 102 
}, 
{ 
"token": "000: 000 dawn of war 3", 
"start_offset": 13, 
"end_offset": 33, 
"type": "shingle", 
"position": 102 
}, 
{ 
"token": "000", 
"start_offset": 13, 
"end_offset": 16, 
"type": "word", 
"position": 103 
}, 
{ 
"token": "000 dawn", 
"start_offset": 13, 
"end_offset": 22, 
"type": "shingle", 
"position": 103 
}, 
{ 
"token": "000 dawn of", 
"start_offset": 13, 
"end_offset": 25, 
"type": "shingle", 
"position": 103 
}, 
{ 
"token": "000 dawn of war", 
"start_offset": 13, 
"end_offset": 29, 
"type": "shingle", 
"position": 103 
}, 
{ 
"token": "000 dawn of war 3", 
"start_offset": 13, 
"end_offset": 33, 
"type": "shingle", 
"position": 103 
}, 
{ 
"token": "dawn", 
"start_offset": 18, 
"end_offset": 22, 
"type": "word", 
"position": 104 
}, 
{ 
"token": "dawn of", 
"start_offset": 18, 
"end_offset": 25, 
"type": "shingle", 
"position": 104 
}, 
{ 
"token": "dawn of war", 
"start_offset": 18, 
"end_offset": 29, 
"type": "shingle", 
"position": 104 
}, 
{ 
"token": "dawn of war 3", 
"start_offset": 18, 
"end_offset": 33, 
"type": "shingle", 
"position": 104 
}, 
{ 
"token": "of war", 
"start_offset": 23, 
"end_offset": 29, 
"type": "shingle", 
"position": 105 
}, 
{ 
"token": "of war 3", 
"start_offset": 23, 
"end_offset": 33, 
"type": "shingle", 
"position": 105 
}, 
{ 
"token": "war", 
"start_offset": 26, 
"end_offset": 29, 
"type": "word", 
"position": 106 
}, 
{ 
"token": "war 3", 
"start_offset": 26, 
"end_offset": 33, 
"type": "shingle", 
"position": 106 
}, 
{ 
"token": "3", 
"start_offset": 30, 
"end_offset": 33, 
"type": "SYNONYM", 
"position": 107 
} 
] 
} 

Основной проблемой здесь является то, что «40» и «000» это разные маркеры. Я думаю, что лучше всего рассматривать их как один токен «40000», есть ли токен-фильтр, который может объединить эти два?

EDIT: Ohhhh! Я пробовал:

 "analyzer": { 
    "default": { 
     "tokenizer": "keyword" 
    }} 

Результат: http://localhost:9200/i/_analyze?text=Warhammer%2040,000:%20Dawn%20of%20War%20III Дал мне:

{ 
"tokens": [ 
{ 
"token": "Warhammer 40", 
"start_offset": 0, 
"end_offset": 12, 
"type": "word", 
"position": 0 
}, 
{ 
"token": "000: Dawn of War III", 
"start_offset": 13, 
"end_offset": 33, 
"type": "word", 
"position": 101 
} 
] 
} 

ответ

0

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

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "standard", 
      "char_filter": [ 
      "decimal_mark_filter" 
      ] 
     } 
     }, 
     "char_filter": { 
     "decimal_mark_filter": { 
      "type": "pattern_replace", 
      "pattern": "(\\d+),(?=\\d)", 
      "replacement": "$1" 
     } 
     } 
    } 
    } 
} 

Анализатор дает следующие символы:

{ 
    "tokens": [ 
    { 
     "token": "Warhammer", 
     "start_offset": 0, 
     "end_offset": 9, 
     "type": "<ALPHANUM>", 
     "position": 0 
    }, 
    { 
     "token": "40000", 
     "start_offset": 10, 
     "end_offset": 16, 
     "type": "<NUM>", 
     "position": 1 
    }, 
    { 
     "token": "Dawn", 
     "start_offset": 18, 
     "end_offset": 22, 
     "type": "<ALPHANUM>", 
     "position": 2 
    }, 
    { 
     "token": "of", 
     "start_offset": 23, 
     "end_offset": 25, 
     "type": "<ALPHANUM>", 
     "position": 3 
    }, 
    { 
     "token": "War", 
     "start_offset": 26, 
     "end_offset": 29, 
     "type": "<ALPHANUM>", 
     "position": 4 
    }, 
    { 
     "token": "III", 
     "start_offset": 30, 
     "end_offset": 33, 
     "type": "<ALPHANUM>", 
     "position": 5 
    } 
    ] 
} 

Это просто модификация примера на the official Elasticsearch documentation