当前位置: 首页 > 面试题库 >

Elasticsearch在不破坏语法的情况下突出显示HTML中的匹配项

乐正宜人
2023-03-14
问题内容

Elasticsearch具有内置的“突出显示”功能,该功能可让您在结果中标记匹配的词(比起初听起来更复杂,因为查询语法可能包含接近匹配等)。

我有HTML字段,当我打开突出显示功能时,Elasticsearch会遍历整个HTML语法。

以这种方式突出显示时,是否可以使其支持HTML / HTML安全?

我希望突出显示应用于HTML文档中的文本,而不是突出显示与搜索匹配的任何HTML标记,即搜索“ p”可能会突出显示<p>p</p>->
<p><mark>p</mark></p>

我的字段被索引为“ type: string”。

该文件说:

编码器:

编码器参数可用于定义突出显示的文本的编码方式。它可以是默认值(无编码)或html(如果使用html突出显示标签,则将转义html)。

..但HTML转义了我本来已经HTML编码的字段,使事情变得更糟。

这是两个示例查询

  1. 使用默认编码器:

高亮标签插入其他标签内,即<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>>" ]
      }

...
  1. 使用html编码器:

Elasticsearch对现有的HTML语法进行了转义,从而破坏了工作,即<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" : [ "&lt;<tag1>p</tag1> class=&quot;text&quot;&gt;TOP STORIES&lt;&#x2F;<tag1>p</tag1>&gt;&lt;<tag1>p</tag1> class=&quot;text&quot;&gt;Middle East&lt;&#x2F;<tag1>p</tag1>&gt;&lt;<tag1>p</tag1> class=&quot;text&quot;&gt;Syria: Developments in Syria are main story in Middle East&lt;&#x2F;<tag1>p</tag1>&gt;" ]
        }
      }

...

问题答案:

实现此目的的一种方法是在分析字段时使用html_strip
char过滤器
preview_html
这样可以确保while匹配不会在html标记上发生,因此突出显示将忽略它,如下面的示例所示。

例:

put test
{
   "settings": {
      "index": {
         "analysis": {
            "char_filter": {
               "my_html": {
                  "type": "html_strip"
               }
            },
            "analyzer": {
               "my_html": {
                  "tokenizer": "standard",
                  "char_filter": [
                     "my_html"
                  ],
                  "type": "custom"
               }
            }
         }
      }
   }
}

put test/test/_mapping
{
   "properties": {
      "preview_html": {
         "type": "string",
         "analyzer": "my_html",
         "search_analyzer": "standard"
      }
   }
}

put test/test/1
{
    "preview_html": "<p> p </p>"
}

post test/test/_search
{
   "query": {
      "match": {
         "preview_html": "p"
      }
   },
   "highlight": {
      "fields": {
         "preview_html": {}
      }
   }
}
 "hits": [
         {
            "_index": "test",
            "_type": "test",
            "_id": "1",
            "_score": 0.30685282,
            "_source": {
               "preview_html": "<p> p </p>"
            },
            "highlight": {
               "preview_html": [
                  "<p> <em>p</em> </p>"
               ]
            }
         }
      ]


 类似资料:
  • 我最近通过从源代码编译在CentOS机器上安装了Python 2.7.3。Python 2.7.3安装在/opt/python2.7上,当我安装它时,我只需更改/usr/bin/Python以指向新版本。这显然是错误的,因为当我这样做的时候,它打破了百胜。我会得到以下内容。 我更改了/usr/bin/python以指向python 2.6.6,但现在2.6.6是python的默认版本。你知道怎么解

  • 问题内容: Eclipse不会为我突出显示匹配的变量: 我已经尝试通过更改“标记出现次数” 但这没用。我不确定在其他人已经能够解决此问题的同时,为什么这不起作用。 谁能告诉我如何设置突出显示的匹配变量? 用我的眼睛寻找相同的变量真的让我非常困扰。 问题答案: 尝试: 选择所有可用的选项。 也请前往: 比较“发生次数”和“写入发生次数”的设置 确保您没有选中其中之一的“文本显示为高亮显示”选项。 这

  • 假设我有两个类叫做ad。 它们都实现了。 对于只有两种方法,分别称为和。 一切都很好。但是,虽然这似乎很好地利用了s,但我认为如果我需要向这个添加方法,实现就会中断,即我需要去实现这些类中的新方法,这打破了“封闭-开放原则”。 所以我想,除了,如果将来需要添加新方法,我还会使用类。 例如,。 这听起来是个好计划(如果不是,请纠正我)。 但问题是,如果这些类已经有其他类了怎么办?在这种情况下,我不能

  • 为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了ClientHTTPPrequestinterceptor。。。 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate时。获取…我将始终获取空对象(即使我看到对象我的响应)。 要解决RestTe

  • 本文向大家介绍Linux中在不破坏磁盘的情况下使用dd命令,包括了Linux中在不破坏磁盘的情况下使用dd命令的使用技巧和注意事项,需要的朋友参考一下 无论你试图从即将坏掉的存储驱动器抢救数据,将归档备份到远程存储,还是在别处对活动分区制作一份完美副本,都要知道如何安全可靠地复制驱动器和文件系统。幸好,有dd这款简单而强大的镜像复制工具,而且历史悠久。在这方面没有比它更出色的工具了。 dd命令的解

  • 问题内容: 我有各种HTML字符串可以切成100个字符(已剥离内容的内容,而不是原始内容),而不剥离标签且不破坏HTML。 原始HTML字符串 (288个字符): 标准修剪: 修剪至100个字符和HTML中断,剥离的内容约40个字符: 剥离的HTML: 输出正确的字符数,但显然失去了格式设置: 局部解决方案: 使用HTML Tidy或Purifier关闭标签可输出干净的HTML,但100个字符的H