我正在执行类似下面的短语查询。它返回给我按相关性排序的突出显示的片段。自然,我希望用户单击一个片段,然后将文档滚动到相应的位置。但是,我在Elasticsearch中看不到任何方法来找出片段在原始文档中的位置。有任何想法吗?
GET documents/doc/_search { "query": { "match_phrase": { "text": { "query": "hello world", "slop": 10 } } }, "highlight" : { "order" : "score", "fields" : { "text" : {"fragment_size" : 100, "number_of_fragments" : 10} } } }
在此期间,我们找不到合适的解决方案,并遭到了以下黑客攻击(对我们而言非常有效):在索引之前,我们用“ [index]”注释文本中的每个单词,以便“ 一些要索引的文本 ”变成“ some [00]文本[01]到[02]索引[03] ”。然后,我们使用char过滤器,如下所示。当突出显示返回时,我们从突出显示文本中解析出单词位置。
"settings": { "analysis": { "char_filter": { "remove_annotation": { "type": "pattern_replace", "pattern": "\\[[0-9]+\\]", "replacement": "" } }, "analyzer": { "annotated_english_language_analyzer": { "type": "custom", "char_filter": [ "remove_annotation" ], ...
请注意,注释索引应填充到log10(text_length)+1数字,以使找到的突出显示(删除注释后)的宽度不取决于发现的位置(从开始到结束)。
log10(text_length)+1