Elasticsearch 用于html 去标签化搜索:即在Index的时候忽略html tag,同时又存储了完整的html,
在使用的时候可以正常读出来。
自定义html analyzer
PUT my_index
{
"settings": {
// 定义两种过滤html标记后,自动生成的没有html标签的index
"analysis": {
"analyzer": {
//对应text类型
"html_text_analyzer": {
"tokenizer": "standard",
"char_filter": ["html_char_filter"]
},
//对应keyword类型
"html_keyword_analyzer": {
"tokenizer": "keyword",
"filter":["trim"],
"char_filter": ["html_char_filter"]
}
},
"char_filter": {
"html_char_filter": {
"type": "html_strip"
}
}
}
},
"mappings": {
// 测试时使用字段子类型,一个字段建立三种index方便比较
"properties": {
"html":{
"type": "text",
"fields": {
"html_text":{
"search_analyzer": "simple",
"analyzer":"html_text_analyzer",
"type":"text"
},
"html_keyword":{
"analyzer":"html_keyword_analyzer",
"type":"text"
}
}
}
}
}
}
// 测试html_text_analyzer
POST my_index/_analyze
{
"analyzer": "html_text_analyzer",
"text": "<p>I'm so <b>happy</b>!</p>"
}
// 返回结果
// 测试html_keyword_analyzer
POST my_index/_analyze
{
"analyzer": "html_keyword_analyzer",
"text": "<p>I'm so <b>happy</b>!</p>"
}
// 返回结果 去除html标记后正常分解
{
"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
}
]
}
// 录入数据 带span标记
POST my_index/_doc
{
"html":"<span>I'm so <b>happy</b>!</span>"
}
//返回结果 去除html标记,全文被索引为一个keyword
{
"tokens" : [
{
"token" : "I'm so happy!",
"start_offset" : 0,
"end_offset" : 32,
"type" : "word",
"position" : 0
}
]
}
// 查询index 结果,原始的text类型使用默认analyzer,查询span,能返回结果是应为span也被索引了
POST my_index/_search
{
"query": {
"match": {
"html": "span"
}
}
}
// 查询使用html_text_analyzer 建立的索引中的span,无返回结果结果,说明html标记没有被索引
POST my_index/_search
{
"query": {
"match": {
"html.html_text": "span"
}
}
}
// 查询使用html_text_analyzer 建立的索引中的happy,能返回结果,html中text 被正常索引
POST my_index/_search
{
"query": {
"match": {
"html.html_text": "happy"
}
}
}
// 查询使用html_keyword_analyzer 建立的索引中的happy,无返回结果,因为这里要用keyword的查询语法
POST my_index/_search
{
"query": {
"match": {
"html.html_keyword": "happy"
}
}
}