是否有可能获得每个突出显示的片段的字符位置?我需要将突出显示的文本与源文档相匹配,并且使字符位置成为可能。
例如:
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"
答案 0 :(得分:10)
客户端方法实际上是标准做法。
我们已经讨论了添加补偿,但担心这会导致更多的混乱。提供的偏移量特定于Java的UTF-16字符串编码,虽然它们在技术上可用于计算$ LANG中的片段,但解析您指定的分隔符的响应文本更为直接。
答案 1 :(得分:5)
我们最终扩展了原始文本:
一些[1]文本[2]我们[3]索引[4]
然后我们定义一个自定义分析器:
"char_filter": {
"remove_tags": {
"type": "pattern_replace",
"pattern": "\\[[0-9]+\\]",
"replacement": ""
现在,在突出显示的片段中,我们获得了位置标记,并且我们知道它们出现在文本中的哪个位置。丑陋,但有效!
我给出了更全面的答案here