lucene Elasticsearch中搜索查询的返回位置和突出显示

zdwk9cvp  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(140)

我正在使用安装在个人Debian服务器上的官方Elasticsearch-PHP客户端,我正在尝试做的是索引、搜索和突出显示单个文档。也就是说,每个搜索结果将只返回一个文档-然后将突出显示该文档用于“简单查询字符串”搜索。我还使用FVH(快速矢量突出显示)。
我的问题和这个Position as result, instead of highlighting类似,测试代码基本上是一样的,所以我在这里就不重复了。但是在我的情况下,我需要**位置和突出显示。我点击了关于术语向量的文档链接,但是就像其他OP一样,我的搜索不是精确的单词 * 本身 *。在某些情况下,它们是短语。我该如何处理这个问题?
我的用例是只搜索一个文档(对于每个查询),并提供一个带有链接的结果摘要,用户可以单击这些链接转到文档中该结果来自的特定位置。如果我有索引/位置,我可以简单地使用它来搜索文档的完整源代码。我已经检查了文档,但没有结果。

jhiyze9q

jhiyze9q1#

您可以尝试安装由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-如果您的用例中偏移量可以替换位置,请转到下一段-您应该使用带有索引选项"with_position_offset_payloads"- doc here的termvector声明您的字段

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会更快,占用的空间也更少:

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 offsetend offset-表示位置的数字。要检索突出显示的内容,需要在['hits']['hits'][0]['_source']['text']中输入-文本是字段名-并使用起始偏移点和结束偏移点从字段中提取文本。需要确保使用正确的字符串编码-UTF-8-否则偏移量与文本不匹配。根据doc:
return_offsets选项将结果从突出显示的字符串更改为突出显示的字符串中的偏移量。如果您需要对突出显示的字符串进行客户端健全性检查,这将非常有用。您将得到类似于0:0- 5,18 -22:22的结果,而不是标记的代码段。外部的数字是代码段的起始和结束偏移量。由,s分隔的数字对是命中数。-之前的数字是起始偏移量,-之后的数字是结束偏移量。多值字段之间的偏移量相当于一个字符。
让我知道如果插件可以帮助!

相关问题