Return Elasticsearch 中搜索查询的位置和突出显示

Return position and highlighting of search queries in Elasticsearch

我正在使用安装在个人 Debian 服务器上的官方 Elasticsearch-PHP 客户端,我正在尝试做的事情涉及索引、搜索和突出显示单个文档。即每个搜索结果只会 return 一个文档 - 然后将突出显示“简单查询字符串”搜索。我也在使用 FVH(快速矢量突出显示)。

我的问题和这个Position as result, instead of highlighting类似,测试代码也基本相同,这里不再赘述。但是在我的例子中,我需要 both 位置和突出显示。我按照 link 找到了有关术语向量的文档,但就像其他 OP 一样,我的搜索本身并不是确切的词 。在某些情况下,它们是短语。我该如何处理?

我的用例是只搜索一个文档(对于每个查询),并用 link 显示结果摘要,用户可以单击它转到文档中包含该结果的特定位置来自。如果我有索引/位置,我可以简单地将其用于文档的完整来源。我查了文档也没用。

您可以尝试安装由 wikimedia foundation 开发的特定插件,名为 Experimental Highlighter -github here

elasticsearch 7.5可以这样安装-其他elasticsearch版本请参考github项目页面:

./bin/elasticsearch-plugin install org.wikimedia.search.highlighter:experimental-highlighter-elasticsearch-plugin:7.5.1

并重启elasticsearch。

因为您还需要检索 positions - 如果对于您的用例,偏移量可以替换位置,请继续阅读下一段 - 您应该使用带索引选项的 termvector 声明您的字段 "with_position_offset_payloads" - 文档 here

PUT /my-index-000001
{ "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_offsets_payloads",
        "analyzer" : "fulltext_analyzer"
       }
     }
   }
}

对于其他不需要检索位置的情况,使用索引选项 "offsets" - elastic doc here, plugin doc here 速度更快,使用更少 space:

PUT /my-index-000001
{ "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "index_options": "offsets",
        "analyzer" : "fulltext_analyzer"
       }
     }
   }
}

然后你可以用实验荧光笔查询,return荧光笔部分的唯一偏移量:

{
  "query": {
    "match": {
      "text": "hello world"
    }
  },
  "highlight": {
    "order": "score",
    "fields": {
      "text": {
        "number_of_fragments": 10,
        "fragment_size": 15,
        "type": "experimental",
        "options": {"return_offset": true}
      }
    }
  }
}

通过这种方式,不会从您的查询中 return 编辑文本,只有 start offsetend offset - 表示位置的数字。要检索突出显示的内容,您需要在 ['hits']['hits'][0]['_source']['text'] 中输入 -text 是您的字段名称 - 并使用您的起始偏移点和结束偏移点从该字段中提取文本。您需要确保使用正确的字符串编码 - UTF-8 - 否则偏移量与文本不匹配。根据文档:

The return_offsets option changes the results from a highlighted string to the offsets in the highlighted that would have been highlighted. This is useful if you need to do client side sanity checking on the highlighting. Instead of a marked up snippet you'll get a result like 0:0-5,18-22:22. The outer numbers are the start and end offset of the snippet. The pairs of numbers separated by the ,s are the hits. The number before the - is the start offset and the number after the - is the end offset. Multi-valued fields have a single character worth of offset between them.

让我知道该插件是否有帮助!