ElasticSearch получает смещения выделенных фрагментов
Можно ли получить позиции символов для каждого выделенного фрагмента? Мне нужно совместить выделенный текст с исходным документом и иметь позиции символов, чтобы это стало возможным.
Например:
curl "localhost:9200/twitter/tweet/_search?pretty=true" -d '{
"query": {
"query_string": {
"query": "foo"
}
},
"highlight": {
"fields": {
"message": {"number_of_fragments": 20}
}
}
}'
возвращает этот высокий свет:
"highlight" : {
"message" : [ "some <em>foo</em> text" ]
}
Если полевое сообщение в согласованном документе было:
"Here is some foo text"
есть ли способ узнать, что фрагмент начинается с char 8 и заканчивается на char 21 совпадающего поля?
Знание смещения начала и конца совпадающего токена было бы полезно для меня - возможно, есть способ получить доступ к этой информации с помощью script_fields? (Этот question показывает, как получить токены, но не смещения).
Поле "сообщение" имеет:
"term_vector" : "with_positions_offsets",
"index_options" : "positions"
Ответы
Ответ 1
Клиентский подход на самом деле является стандартной практикой.
Мы обсудили добавление смещений, но боимся, что это приведет к большей путанице. Предоставленные смещения специфичны для кодирования строк Java UTF-16 String, которые, хотя они могут быть технически использованы для вычисления фрагментов из $LANG, более просто проанализировать текст ответа для указанных разделителей.
Ответ 2
Мы закончили тем, что расширили исходный текст следующим образом:
некоторый [1] текст [2] мы [3] индекс [4]
Затем мы определяем собственный анализатор с:
"char_filter": {
"remove_tags": {
"type": "pattern_replace",
"pattern": "\\[[0-9]+\\]",
"replacement": ""
Теперь в выделенных фрагментах мы получаем теги местоположения, и мы знаем, где они находятся в тексте. Уродливо, но работает!
Я дал более полный ответ здесь