【发布时间】:2016-11-29 21:31:49
【问题描述】:
Elasticsearch 有一个内置的“突出显示”功能,允许您在结果中标记匹配的术语(比乍听起来更复杂,因为查询语法可以包括近似匹配等)。
我有 HTML 字段,当我打开高亮显示时,Elasticsearch 会覆盖整个 HTML 语法。
我可以在以这种方式突出显示时使其支持 HTML/HTML 安全吗?
我希望突出显示应用于 HTML 文档中的文本,而不是突出显示与搜索匹配的任何 HTML 标记,即搜索“p”可能会突出显示 <p>p</p> -> <p><mark>p</mark></p>。
我的字段被索引为“type: string”。
编码器:
编码器参数可用于定义如何突出显示 文本将被编码。它可以是默认(无编码)或 html (如果您使用 html 高亮标签,将转义 html)。
.. 但是 HTML 转义了我已经 HTML 编码的字段,进一步破坏了事情。
这里有两个示例查询
- 使用默认编码器:
高亮标签被插入到其他标签中,即<p> -> <<tag1>p</tag1>>:
curl -XPOST -H 'Content-type: application/json' "http://localhost:7200/myindex/_search?pretty" -d '
{
"query": { "match": { "preview_html": "p" } },
"highlight": {
"pre_tags" : ["<tag1>"],
"post_tags" : ["</tag1>"],
"encoder": "default",
"fields": {
"preview_html" : {}
}
},
"from" : 22, "size" : 1
}'
GIVES:
...
"highlight" : {
"preview_html" : [ "<<tag1>p</tag1> class=\"text\">TOP STORIES</<tag1>p</tag1>><<tag1>p</tag1> class=\"text\">Middle East</<tag1>p</tag1>><<tag1>p</tag1> class=\"text\">Syria: Developments in Syria are main story in Middle East</<tag1>p</tag1>>" ]
}
...
- 使用
html编码器:
现有的 HTML 语法被 elasticsearch 转义,这会破坏事物,即<p> -> &lt;<tag1>p</tag1>&gt;:
curl -XPOST -H 'Content-type: application/json' "http://localhost:7200/myindex/_search?pretty" -d '
{
"query": { "match": { "preview_html": "p" } },
"highlight": {
"pre_tags" : ["<tag1>"],
"post_tags" : ["</tag1>"],
"encoder": "html",
"fields": {
"preview_html" : {}
}
},
"from" : 22, "size" : 1
}'
GIVES:
...
"highlight" : {
"preview_html" : [ "<<tag1>p</tag1> class="text">TOP STORIES</<tag1>p</tag1>><<tag1>p</tag1> class="text">Middle East</<tag1>p</tag1>><<tag1>p</tag1> class="text">Syria: Developments in Syria are main story in Middle East</<tag1>p</tag1>>" ]
}
}
...
【问题讨论】:
-
你想像
<tag1><p></tag1>一样拥有它吗? -
另外,能否提供
preview_html字段的映射关系? -
@AndreiStefan:我已经更新了问题文本来回答你的两个问题。
-
很抱歉,您没有回答问题。
type: string是该字段的唯一详细信息吗?您没有定义或类似的分析器?另外,您说 不要突出显示与搜索匹配的任何 HTML 标记,但在示例中您要突出显示 html 标记 (<p><mark>p</mark></p>),那么它是哪一个? -
1.是的,“类型:字符串”是我为该列提供 ES 的唯一映射指令。任何分析器都将是默认分析器。 2. 示例显示文本中的“p”用“”突出显示,但 HTML 标记名称
中的“p”未突出显示(与第一个示例查询相比问题)。