Как искать как числа, так и мое слово, используя встроенный или настраиваемый анализатор в упругом поиске
Этот вопрос является продолжением моего предыдущего вопроса. У меня есть текст, по которому я хочу выполнить поиск как по цифрам, так и по тексту.
Мой текст: -
8080 amit.foobar.getFooLabelFrombar (test.java:91)
И я хочу искать на getFooLabelFrombar
, fooBar
, 8080
а также 91
,
Ранее я использовал simple
анализатор, который разбивал вышеуказанный текст на токены ниже.
"tokens": [
{
"token": "amit",
"start_offset": 5,
"end_offset": 9,
"type": "word",
"position": 1
},
{
"token": "foobar",
"start_offset": 10,
"end_offset": 16,
"type": "word",
"position": 2
},
{
"token": "getfoolabelfrombar",
"start_offset": 17,
"end_offset": 35,
"type": "word",
"position": 3
},
{
"token": "test",
"start_offset": 36,
"end_offset": 40,
"type": "word",
"position": 4
},
{
"token": "java",
"start_offset": 41,
"end_offset": 45,
"type": "word",
"position": 5
}
]
}
Beaucase из которых, поиск по foobar
а также getFooLabelFrombar
давал результат поиска, но не 8080
а также 91
, так как простой анализатор не токенизирует числа.
Тогда, как предложено в пред. ТАК сообщение, я изменил анализатор на Standard
, из-за которых числа для поиска, но не другие 2 строки поиска слова. Как стандартный анализатор создаст ниже токены:
{
"tokens": [
{
"token": "8080",
"start_offset": 0,
"end_offset": 4,
"type": "<NUM>",
"position": 1
},
{
"token": "amit.foobar.getfoolabelfrombar",
"start_offset": 5,
"end_offset": 35,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "test.java",
"start_offset": 36,
"end_offset": 45,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "91",
"start_offset": 46,
"end_offset": 48,
"type": "<NUM>",
"position": 4
}
]
}
Я прошел весь существующий анализатор в ES, но, кажется, ничто не отвечает моим требованиям. Я попытался создать свой собственный анализатор, но он тоже не работает.
{
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "letter"
"filter" : ["lowercase", "extract_numbers"]
}
},
"filter" : {
"extract_numbers" : {
"type" : "keep_types",
"types" : [ "<NUM>","<ALPHANUM>","word"]
}
}
}
}
Пожалуйста, предложите, Как я могу построить свой собственный анализатор, чтобы удовлетворить мои требования.
1 ответ
Как насчет использования символьного фильтра для замены точек пробелами?
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": ["replace_dots"]
}
},
"char_filter": {
"replace_dots": {
"type": "mapping",
"mappings": [
". => \\u0020"
]
}
}
}
}
}
POST /my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "8080 amit.foobar.getFooLabelFrombar(test.java:91)"
}
Какой вывод, что вы хотите:
{
"tokens" : [
{
"token" : "8080",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<NUM>",
"position" : 0
},
{
"token" : "amit",
"start_offset" : 5,
"end_offset" : 9,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "foobar",
"start_offset" : 10,
"end_offset" : 16,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "getFooLabelFrombar",
"start_offset" : 17,
"end_offset" : 35,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "test",
"start_offset" : 36,
"end_offset" : 40,
"type" : "<ALPHANUM>",
"position" : 4
},
{
"token" : "java",
"start_offset" : 41,
"end_offset" : 45,
"type" : "<ALPHANUM>",
"position" : 5
},
{
"token" : "91",
"start_offset" : 46,
"end_offset" : 48,
"type" : "<NUM>",
"position" : 6
}
]
}