当前位置:首页 > ES > 正文内容

elasticsearch用于html去标签化搜索

phpmianshi1年前 (2019-07-12)ES43

场景


elasticsearch用于html去标签化搜索:即在Index的时候忽略html tag,同时又存储了完整的html,在使用的时候可以正常读出来。


示例


假设我们给content字段自定义analyzer ,分别是:html_text_analyzer,html_keyword_analyzer


定义两种过滤html标记后,自动生成的没有html标签的index

PUT my_index
{
  "settings": { 
    "analysis": {
      "analyzer": {
        "html_text_analyzer": {
          "tokenizer": "standard",
          "char_filter": ["html_char_filter"]
        },
        "html_keyword_analyzer": {
          "tokenizer": "keyword",
          "filter":["trim"],
          "char_filter": ["html_char_filter"]
        }
      },
      "char_filter": {
        "html_char_filter": {
          "type": "html_strip"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content":{
        "type": "text",
        "fields": {
          "html_text":{
            "search_analyzer": "simple",
            "analyzer":"html_text_analyzer",
            "type":"text"
          },
          "html_keyword":{
            "analyzer":"html_keyword_analyzer",
            "type":"text"
          }
        }
      }
    }
  }}

mappings 设置字段子类型,一个字段建立三种index (默认:analyzer,html_text,html_keyword),方便比较


查看刚才设置的mappings

GET my_index/_mapping


下面我们测试一下html_text_analyzer

//测试

POST my_index/_analyze
{
  "analyzer": "html_text_analyzer",
  "text": "<p>I&apos;m so <b>happy</b>!</p>"
}

// 返回结果

{
  "tokens" : [
    {
      "token" : "I'm",
      "start_offset" : 3,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "so",
      "start_offset" : 12,
      "end_offset" : 14,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "happy",
      "start_offset" : 18,
      "end_offset" : 27,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}

下面我们测试一下html_keyword_analyzer

POST my_index/_analyze
{
  "analyzer": "html_keyword_analyzer",
  "text": "<p>I&apos;m so <b>happy</b>!</p>"
}

// 返回结果  去除html标记,全文被索引为一个keyword
{
  "tokens" : [
    {
      "token" : "I'm so happy!",
      "start_offset" : 0,
      "end_offset" : 32,
      "type" : "word",
      "position" : 0
    }
  ]
}


录入数据测试比较一下:

//录入数据 带span标记
POST my_index/_doc
{
  "content":"<span>I&apos;m so <b>happy</b>!</span>"
}


//查询my_index结果,原始的text类型使用默认analyzer,查询span,能返回结果是因为span也被索引了

POST my_index/_search
{
  "query": {
    "match": {
      "content": "span"
    }
   }
}
  
  
//查询使用html_text_analyzer建立的索引中的span,无返回结果结果,说明html标记没有被索引

POST my_index/_search
{
  "query": {
    "match": {
      "content.html_text": "span"
    }
   }
}
  
  
//查询使用html_text_analyzer建立的索引中的happy,能返回结果,html中text被正常索引

POST my_index/_search
{
  "query": {
    "match": {
      "content.html_text": "happy"
    }
   }
}
  
// 查询使用html_keyword_analyzer建立的索引中的happy,无返回结果,因为这里要用keyword的查询语法

POST my_index/_search
{
  "query": {
    "match": {
      "content.html_keyword": "happy"
    }
   }
}


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

elasticsearch中SearchApi的详解

搜索流程当一个搜索请求被发送到某个节点时,这个节点就变成了协调节点。 这个节点的任务是广播查询请求到所有相关分片并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端。多索引搜...

使用logstash-input-jdbc同步mysql到es

数据同步方式全量同步与增量同步全量同步是指全部将数据同步到es,通常是刚建立es,第一次同步时使用。增量同步是指将后续的更新、插入记录同步到es。(删除记录没有办法同步,只能两边执行自己的删除命令)常...

elasticsearch中动态模板全解实战

动态模板在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。那是因为ES可以动态映射,添加文档的时候遇到没有的字段,可以动态的添加到m...

es中单机部署状态为Yellow解决办法

es中单机部署状态为Yellow解决办法

背景单机版的 ES 状态为 Yellow,在 Kibana 的管理界面看到的 index 的状态也是 Yellow这个问题在于单机版的 ES,是没有备份的,没有副本,设置 index 副本的数量为 0...

elasticsearch中mapping全解实战

Mapping简介#mapping 是用来定义文档及其字段的存储方式、索引方式的手段,例如利用mapping 来定义以下内容:哪些字段需要被定义为全文检索类型哪些字段包含number、dat...

elasticsearch中重新索引数据

概念虽然你可以给索引添加新的类型,或给类型添加新的字段,但是你不能添加新的分析器或修改已有字段。假如你这样做,已被索引的数据会变得不正确而你的搜索也不会正常工作。 修改在已存在的数据最简单的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。