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 offset
和 end 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.
让我知道该插件是否有帮助!
我正在使用安装在个人 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 offset
和 end 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.
让我知道该插件是否有帮助!