使用 Elasticsearch,我可以为不同的匹配标记使用不同的 HTML 标记突出显示吗?
With Elasticsearch, can I highlight with different HTML tags for different matched tokens?
目前正在学习 ES,但我非常渴望实现它。
我知道您可以在查询中使用 highlight
的 pre_tags
和 post_tags
键,使用不同的标签突出显示不同的 字段 。 .. 但是是否可以传递一个标记字符串,其中 returned 片段对每个单独的识别词都有不同的 HTML 颜色标签,例如使用 simple query string?
所以我用“有趣的数据”进行查询,文档字段是这样 returned 的:
the other day I was walking through the woods and I had an <font color="blue">interesting</font>
thought about some <font color="red">data</font>
我的意思不仅仅是标签“无意识地”交替:同样,您可以使用 Fast Vector Highlighter,例如:
"highlight": {
"fields": {
"description": {
"pre_tags": ["<b>", "<em>"],
"post_tags": ["</b>", "</em>"]
相反,我想要字段
"the other data day data was walking through some interesting woods
and data had an interesting thought about some data"
return编辑如下:
the other <font color="red">data</font> day <font color="red">data</font> was walking through some <font color="blue">
interesting</font> woods and <font color="red">data</font> had an <font color="blue">
interesting</font> thought about some <font color="red">data</font>
我之前使用 Lucene 进行编码,即 Java,并且我确实设法实现了这类事情,主要是通过跳过篮球。
注意一个答案可能是“忘记 ES return 标记文本,只需使用 re.sub( r'\bdata\b', '<font color="red">data</font>', field_string )
应用您自己的标签”。
这对于像这样的简单用例来说是可以的。但它不适用于词干分析器。例如,举一个法语的例子:搜索查询是“changer élément”。我想要以下标记结果:
Les autres <font color="red">éléments</font> ont été <font color="blue">
changés</font> car on a appliqué un <font color="blue">changement</font>
à chaque <font color="red">élément</font>
即“changer”、“changés”和“changement”都源于“chang”,“élément”和“éléments”源于“element”。因此,该字段的标准突出显示 return 为:
Les autres <em>éléments</em> ont été <em>changés</em> car on a appliqué un
<em>changement</em> à chaque <em>élément</em>
快速矢量荧光笔是一个很好的起点。我还没有用法语工作过,所以不要考虑以下权威但基于内置 french
analyzer,我们可以做这样的事情:
PUT multilang_index
{
"mappings": {
"properties": {
"description": {
"type": "text",
"term_vector": "with_positions_offsets",
"fields": {
"french": {
"type": "text",
"analyzer": "french",
"term_vector": "with_positions_offsets"
}
}
}
}
}
}
仅供参考,french
分析器可能是 reimplemented/extended as shown here。
摄取英语和法语示例后:
POST multilang_index/_doc
{
"description": "the other data day data was walking through some interesting woods and data had an interesting thought about some data"
}
POST multilang_index/_doc
{
"description": "Les autres éléments ont été changés car on a appliqué un changement à chaque élément"
}
我们可以这样查询 interesting data
:
POST multilang_index/_search
{
"query": {
"simple_query_string": {
"query": "interesting data",
"fields": [
"description"
]
}
},
"highlight": {
"fields": {
"description": {
"type": "fvh",
"pre_tags": ["<font color=\"red\">", "<font color=\"blue\">"],
"post_tags": ["</font>", "</font>"]
}
},
"number_of_fragments": 0
}
}
屈服
the other <font color="blue">data</font> day <font color="blue">data</font>
was walking through some <font color="red">interesting</font> woods and
<font color="blue">data</font> had an <font color="red">interesting</font>
thought about some <font color="blue">data</font>
与 changer élément
类似:
POST multilang_index/_search
{
"query": {
"simple_query_string": {
"query": "changer élément",
"fields": [
"description.french"
]
}
},
"highlight": {
"fields": {
"description.french": {
"type": "fvh",
"pre_tags": ["<font color=\"red\">", "<font color=\"blue\">"],
"post_tags": ["</font>", "</font>"]
}
},
"number_of_fragments": 0
}
}
屈服
Les autres <font color="blue">éléments</font> ont été
<font color="red">changés</font> car on a appliqué un
<font color="red">changement</font> à chaque <font color="blue">élément</font>
在我看来,词干正确。
请注意,pre_tags
顺序是根据 simple_query_string
查询中匹配 第一个 的令牌强制执行的。当查询 changer élément
时,description
中的 shingle éléments
匹配 first 但导致它匹配的是第二个标记(élément
), 因此 blue
html 标签而不是 red
.
目前正在学习 ES,但我非常渴望实现它。
我知道您可以在查询中使用 highlight
的 pre_tags
和 post_tags
键,使用不同的标签突出显示不同的 字段 。 .. 但是是否可以传递一个标记字符串,其中 returned 片段对每个单独的识别词都有不同的 HTML 颜色标签,例如使用 simple query string?
所以我用“有趣的数据”进行查询,文档字段是这样 returned 的:
the other day I was walking through the woods and I had an <font color="blue">interesting</font>
thought about some <font color="red">data</font>
我的意思不仅仅是标签“无意识地”交替:同样,您可以使用 Fast Vector Highlighter,例如:
"highlight": {
"fields": {
"description": {
"pre_tags": ["<b>", "<em>"],
"post_tags": ["</b>", "</em>"]
相反,我想要字段
"the other data day data was walking through some interesting woods and data had an interesting thought about some data"
return编辑如下:
the other <font color="red">data</font> day <font color="red">data</font> was walking through some <font color="blue">
interesting</font> woods and <font color="red">data</font> had an <font color="blue">
interesting</font> thought about some <font color="red">data</font>
我之前使用 Lucene 进行编码,即 Java,并且我确实设法实现了这类事情,主要是通过跳过篮球。
注意一个答案可能是“忘记 ES return 标记文本,只需使用 re.sub( r'\bdata\b', '<font color="red">data</font>', field_string )
应用您自己的标签”。
这对于像这样的简单用例来说是可以的。但它不适用于词干分析器。例如,举一个法语的例子:搜索查询是“changer élément”。我想要以下标记结果:
Les autres <font color="red">éléments</font> ont été <font color="blue">
changés</font> car on a appliqué un <font color="blue">changement</font>
à chaque <font color="red">élément</font>
即“changer”、“changés”和“changement”都源于“chang”,“élément”和“éléments”源于“element”。因此,该字段的标准突出显示 return 为:
Les autres <em>éléments</em> ont été <em>changés</em> car on a appliqué un
<em>changement</em> à chaque <em>élément</em>
快速矢量荧光笔是一个很好的起点。我还没有用法语工作过,所以不要考虑以下权威但基于内置 french
analyzer,我们可以做这样的事情:
PUT multilang_index
{
"mappings": {
"properties": {
"description": {
"type": "text",
"term_vector": "with_positions_offsets",
"fields": {
"french": {
"type": "text",
"analyzer": "french",
"term_vector": "with_positions_offsets"
}
}
}
}
}
}
仅供参考,french
分析器可能是 reimplemented/extended as shown here。
摄取英语和法语示例后:
POST multilang_index/_doc
{
"description": "the other data day data was walking through some interesting woods and data had an interesting thought about some data"
}
POST multilang_index/_doc
{
"description": "Les autres éléments ont été changés car on a appliqué un changement à chaque élément"
}
我们可以这样查询 interesting data
:
POST multilang_index/_search
{
"query": {
"simple_query_string": {
"query": "interesting data",
"fields": [
"description"
]
}
},
"highlight": {
"fields": {
"description": {
"type": "fvh",
"pre_tags": ["<font color=\"red\">", "<font color=\"blue\">"],
"post_tags": ["</font>", "</font>"]
}
},
"number_of_fragments": 0
}
}
屈服
the other <font color="blue">data</font> day <font color="blue">data</font>
was walking through some <font color="red">interesting</font> woods and
<font color="blue">data</font> had an <font color="red">interesting</font>
thought about some <font color="blue">data</font>
与 changer élément
类似:
POST multilang_index/_search
{
"query": {
"simple_query_string": {
"query": "changer élément",
"fields": [
"description.french"
]
}
},
"highlight": {
"fields": {
"description.french": {
"type": "fvh",
"pre_tags": ["<font color=\"red\">", "<font color=\"blue\">"],
"post_tags": ["</font>", "</font>"]
}
},
"number_of_fragments": 0
}
}
屈服
Les autres <font color="blue">éléments</font> ont été
<font color="red">changés</font> car on a appliqué un
<font color="red">changement</font> à chaque <font color="blue">élément</font>
在我看来,词干正确。
请注意,pre_tags
顺序是根据 simple_query_string
查询中匹配 第一个 的令牌强制执行的。当查询 changer élément
时,description
中的 shingle éléments
匹配 first 但导致它匹配的是第二个标记(élément
), 因此 blue
html 标签而不是 red
.