30

是否可以获得每个突出显示的片段的字符位置?我需要将突出显示的文本与源文档匹配,并且具有字符位置将使其成为可能。

例如:

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 访问该信息?(这个问题显示了如何获取令牌,而不是偏移量)。

“消息”字段具有:

"term_vector" : "with_positions_offsets",
"index_options" : "positions" 
4

2 回答 2

12

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

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

于 2013-08-15T04:04:52.173 回答
6

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

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

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

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

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

我在这里给出了更全面的答案

于 2016-02-20T11:04:48.397 回答