Подтвердить что ты не робот

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" 
4b9b3361

Ответ 1

Клиентский подход на самом деле является стандартной практикой.

Мы обсудили добавление смещений, но боимся, что это приведет к большей путанице. Предоставленные смещения специфичны для кодирования строк Java UTF-16 String, которые, хотя они могут быть технически использованы для вычисления фрагментов из $LANG, более просто проанализировать текст ответа для указанных разделителей.

Ответ 2

Мы закончили тем, что расширили исходный текст следующим образом:

некоторый [1] текст [2] мы [3] индекс [4]

Затем мы определяем собственный анализатор с:

"char_filter": {
        "remove_tags": {
          "type": "pattern_replace",
          "pattern": "\\[[0-9]+\\]",
          "replacement": ""

Теперь в выделенных фрагментах мы получаем теги местоположения, и мы знаем, где они находятся в тексте. Уродливо, но работает!

Я дал более полный ответ здесь