разрывы строк или знаки препинания в качестве зазоров положения в elasticsearch
в elasticsearch есть ли способ настроить анализатор, который будет создавать зазоры между маркерами при обнаружении разрывов строк или знаков препинания?
предположим, я индексирую объект со следующей бессмысленной строкой (с разрывом строки) в качестве одного из его полей:
The quick brown fox runs after the rabbit.
Then comes the jumpy frog.
стандартный анализатор выдаст следующие токены с соответствующими позициями:
0 the
1 quick
2 brown
3 fox
4 runs
5 after
6 the
7 rabbit
8 then
9 comes
10 the
11 jumpy
12 frog
это означает, что a match_phrase
запрос the rabbit then comes
будет соответствовать этому документу как хит.
Есть ли способ, чтобы ввести пробел между rabbit
и then
так что он не соответствует, если - это?
конечно, обходным путем может быть преобразование одной строки в массив (одна строка на запись) и использование position_offset_gap
в отображении полей, но я бы предпочел сохранить одну строку с новыми строками (и окончательное решение будет включать большие пробелы в позициях для новых строк, чем, скажем, для знаков препинания).
1 ответов
Я в конце концов понял решение, используя char_filter
чтобы ввести дополнительные токены на разрывы строк и знаки препинания:
PUT /index
{
"settings": {
"analysis": {
"char_filter": {
"my_mapping": {
"type": "mapping",
"mappings": [ ".=>\n_PERIOD_\n", "\n=>\n_NEWLINE_\n" ]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": ["my_mapping"],
"filter": ["lowercase"]
}
}
}
}
}
тестирование с помощью примера string
POST /index/_analyze?analyzer=my_analyzer&pretty
The quick brown fox runs after the rabbit.
Then comes the jumpy frog.
дает следующий результат:
{
"tokens" : [ {
"token" : "the",
"start_offset" : 0,
"end_offset" : 3,
"type" : "<ALPHANUM>",
"position" : 1
}, {
... snip ...
"token" : "rabbit",
"start_offset" : 35,
"end_offset" : 41,
"type" : "<ALPHANUM>",
"position" : 8
}, {
"token" : "_period_",
"start_offset" : 41,
"end_offset" : 41,
"type" : "<ALPHANUM>",
"position" : 9
}, {
"token" : "_newline_",
"start_offset" : 42,
"end_offset" : 42,
"type" : "<ALPHANUM>",
"position" : 10
}, {
"token" : "then",
"start_offset" : 43,
"end_offset" : 47,
"type" : "<ALPHANUM>",
"position" : 11
... snip ...
} ]
}