首页 > 解决方案 > 返回 Elasticsearch 中搜索查询的位置和突出显示

问题描述

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

我的问题和这个Position 结果类似,不是高亮,而且测试代码基本相同,这里不再赘述。但是在我的情况下,我需要定位和突出显示我点击了有关术语向量的文档的链接,但就像其他 OP 一样,我的搜索本身并不是确切的单词。在某些情况下,它们是短语。我将如何处理这个?

我的用例是只搜索一个文档(对于每个查询),并显示带有链接的结果摘要,用户可以单击这些链接转到文档中该结果来自的特定位置。如果我有索引/位置,我可以简单地将它用于文档的完整来源。我检查了文档无济于事。

标签: elasticsearchsearchluceneelasticsearch-phpfast-vector-highlighter

解决方案


您可以尝试在此处安装由维基媒体基金会开发的名为Experimental Highlighter -github的特定插件

您可以通过这种方式安装elasticsearch 7.5 - 对于其他elasticsearch版本请参考github项目页面:

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

并重启elasticsearch。

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

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

对于其他不需要检索位置的情况,使用索引选项更快并且使用更少的空间-此处"offsets"为弹性文档,此处为插件文档:

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

然后您可以使用实验荧光笔查询并仅返回荧光笔部分的偏移量:

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

这样,您的查询不会返回任何文本,而只会返回代表位置start offset的数字和end offset- 数字。要检索突出显示的内容,您需要在里面输入['hits']['hits'][0]['_source']['text']-text 是您的字段名称 - 并使用您的起始偏移点和结束偏移点从字段中提取文本。您需要确保使用正确的字符串编码 - UTF-8- 否则偏移量与文本不匹配。根据文档:

return_offsets 选项将结果从突出显示的字符串更改为突出显示的偏移量。如果您需要对突出显示进行客户端完整性检查,这很有用。您将得到类似 0:0-5,18-22:22 的结果,而不是标记的片段。外部数字是片段的开始和结束偏移量。由 ,s 分隔的数字对是命中。- 之前的数字是开始偏移量, - 之后的数字是结束偏移量。多值字段之间具有单个字符的偏移量。

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


推荐阅读