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

ElasticSearch阻止html标签可搜索

郭元明
2023-03-14
问题内容

我有一个由其他应用程序标记的文本。我不希望查询这些标签时返回查询。

我尝试使用html_strip,但仍可以搜索这些标签。

标签的示例可能有所不同,但与相似<PERSON>Freddy</PERSON>。我也尝试过<span>Freddy</span>,在两个结果中,我都可以搜索
spanPERSON 并获得结果,而这些词不会出现在其他任何地方。

我究竟做错了什么?

索引映射:

{
  "mapping": {
    "properties":{
        "text":{
            "type":"text",
            "analyzer":"my_analyzer"
        }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip"
        }
      }
    }
  }
}

询问

{
    "query":{
        "match":{
            "text":"span"
        }
    },
    "highlight":{
        "fields":{
            "text":{}
        }
    }
}

响应:

..
"hits": [
            {
                "_index": "my_index",
                "_type": "wat",
                "_id": "1",
                "_score": 0.39556286,
                "_source": {
                    "text": "Hello <span>Freddy</span>"
                },
                "highlight": {
                    "text": [
                        "Hello <<em>span</em>>Freddy</<em>span</em>>"
                    ]
                }
            }
        ]
...

问题答案:

你这里有几个问题。首先,mapping应该是mappings,并且在声明映射时丢失了类型(因此您的类型wat实际上根本没有获得该映射)。您可以使用此:

{
  "mappings": {
    "wat": {
      "properties": {
        "text": {
          "type": "text",
          "analyzer": "my_analyzer"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip"
        }
      }
    }
  }
}

您可以使用get mapping
API
来确认您看到的映射类型符合wat您的期望。

然后,如果您为索引Hello <span>Freddy</span>并搜索Hello Freddy,您将看到此结果。存储的术语是Hello Freddy,但是您将span在搜索结果中看到标记,因为结果返回的是源(您索引的值),而不是分析的术语。(如果您搜索Hello <span>Freddy</span>,也会看到相同的结果,但这是因为查询文本的分析方式与索引文本的分析方式相同。)

请注意,由于您已使用了分keyword词器,因此如果搜索Hello或,将不会获得任何结果Freddy。如果要在字符串中搜索,而不是搜索完整的字符串(或通配符,正则表达式等),则应使用其他令牌生成器(如standard令牌生成器)。

另一个警告:html_strip过滤器似乎仅过滤有效的html标签(因此不适用于<PERSON>)。您可能可以改用模式过滤器。



 类似资料:
  • 问题内容: 我最近看到了很多用于在HTML页面中搜索和突出显示术语的库。但是,我看到的每个库都存在相同的问题,它们找不到部分用html标记封装的文本,并且/或者找不到包含&表示的特殊字符。 示例a: 搜索“测试”将找到第一个实例,但找不到第二个实例。 示例b: 搜索“lápices”或“ lapices”将不会产生结果。 有没有这样做的JS库,或者至少是一种避免这些障碍的方法? 提前致谢! 问题答

  • 本文向大家介绍HTML标签 和 有什么区别?,包括了HTML标签 和 有什么区别?的使用技巧和注意事项,需要的朋友参考一下 <div>和<span>均用于定义网页的各个部分。<span>元素显示文档的内联部分。<div>元素显示文档的块级部分。 div是块级元素,而span是内联元素。 div应该用于包装文档的各个部分,而跨度则用于包装文本,图像等的一小部分。 这是一个例子: 在HTML中创建基于

  • HTML 标签 HTML5 标签集合 文档章节 <body> 页面内容 <header> 文档头部 <nav> 导航 <aside> 侧边栏 <article> 定义外部内容(如外部引用的文章) <section> 一个独立的块 <footer> 尾部 页面通常结构 文本标签 <!-- 默认超链接 --> <a href="http://sample-link.com" title="Sampl

  • HTMl标签(Lables)指的是可以放置在图表中任意位置的文字标签,由于最终的文字标签是以 SVG 渲染的,所以标签的内容只支持少量的 HTML 标签,包括:<b>、<strong>、<i>、<em>、<br/>、<span>,其中 可以通过 style 属性来设定样式,但是有效的样式仅限和文字相关的属性。HTML 标签的基本构造是: labels: { style: {

  • 本文向大家介绍html的标签 除了用作跳转链接外,还有哪些用途?相关面试题,主要包含被问及html的标签 除了用作跳转链接外,还有哪些用途?时的应答技巧和注意事项,需要的朋友参考一下 只知道下载(download)和锚定位(name)…… 看了文档之后,发现还有: media属性,是为特殊设备(比如 iPhone)、语音或打印媒介设计的,比较常用的估计有打印预览模式/打印页面吧。

  • 我一直在开发一个包含多个ActionBar活动的应用程序,从一开始HomeAsUp按钮就可以看到,并且可以处理从MainActivity中选择的所有活动。今天我注意到它已经不存在了,但我不知道我改变了什么会影响它。 最近几天最重大的变化是我将项目从Eclipse迁移到Android Studio,因为我遇到了Eclipse经常损坏我的项目文件并需要完全重新安装的问题。 这是创建新活动的主活动中的代