ElasticSearch获得突出显示的片段的偏移量

时间:2013-02-25 17:30:07

标签: 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" 

2 个答案:

答案 0 :(得分:10)

客户端方法实际上是标准做法。

我们已经讨论了添加补偿,但担心这会导致更多的混乱。提供的偏移量特定于Java的UTF-16字符串编码,虽然它们在技术上可用于计算$ LANG中的片段,但解析您指定的分隔符的响应文本更为直接。

答案 1 :(得分:5)

我们最终扩展了原始文本:

  

一些[1]文本[2]我们[3]索引[4]

然后我们定义一个自定义分析器:

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

现在,在突出显示的片段中,我们获得了位置标记,并且我们知道它们出现在文本中的哪个位置。丑陋,但有效!

我给出了更全面的答案here