01.analyzer简介及char_filter组件

1. es的词分析组件analyzer简介

文档在进行存储之前,先要进行处理,同样的,在查询之前query也要进行处理,这些处理主要是分词,去掉停用词等信息,这些功能能都是由一个叫analyzer的组件来实现的。

1.1 在index的时候如何选择analyzer

在进行index的时候,
1.首先会使用 index mapping中对该filed定义的analyzer进行analysis
2.当对应的field没有定义对应的analyzer的时候,会查找在定义index mapping的时候是否有定义对应的 名字为 default的的analyzer
3.如果index的setting没有配置 default analyzer,那么es会使用默认的standard analyzer进行处理

1.1.1. 使用index mapping中对该filed进行analysis
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_english": {
          "type":      "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type":     "text",
        "analyzer": "std_english"
      }
    }
  }
}

像这样在定义index的时候对某个字段定义了一个analyzer,那么在往这个indices中index数据的时候就会使用std_english analyzer.

1.1.2. default analyzer

当对应的field没有定义对应的analyzer的时候,会查找在定义index mapping的时候是否有定义对应的 名字为 default的的analyzer

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        }
      }
    }
  }
}

这样,在1没有命中的话会默认使用default analyzer.

1.1.3.使用standard ananlyzer

如果index的setting没有配置 default analyzer,那么es会使用默认的standard analyzer进行处理

At index time, if no analyzer has been specified, 
it looks for an analyzer in the index settings called default.
Failing that, it defaults to using the standard analyzer.
 

1.2 在search的时候如何选择analyzer

在query查询的时候也会使用analyzer对query进行分析处理,具体使用哪个analyzer也是有一定的选择机制的。

  1. 优先使用在query中指定的analyzer
  2. 使用index mapping中对该field定义的 search_analyzer
  3. 使用mapping中field定义的analyzer
  4. 使用index setting中定义的 名字为 default_search 的analyzer
  5. 使用index setting中定义的名字为 default 的analyzer
  6. 使用standard analyzer

注意,这个地方和最新的7.5的文档叙述有出入,7.5中是3和4调换了一下位置

1.2.1. 优先使用在query中指定的analyzer
GET my_index/_search
{
  "query": {
    "match": {
      "message": {
        "query": "Quick foxes",
        "analyzer": "stop"
      }
    }
  }
}
1.2.2. 使用index mapping中对该field定义的 search_analyzer
PUT my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace",
        "search_analyzer": "simple"
      }
    }
  }
}

1.2.3. 使用mapping中field定义的analyzer
PUT my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace"
      }
    }
  }
}

1.2.4. 使用index setting中定义的 名字为 default_search 的analyzer
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        },
        "default_search": {
          "type": "whitespace"
        }
      }
    }
  }
}

1.2.5. 使用index setting中定义的名字为 default 的analyzer
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        }
      }
    }
  }
}

2. analyzer的内部结构

实际上analyzer是由三个部分构成

  1. character filters:
    character filter 的输入是原始的文本text,然后他进行一些addding,removing,change characters 操作
  2. tokenizers:
    tokenizer的输入是character filter 处理过的字符,他的功能是根据一定的规则或者词库进行分词,将text切成一个一个独立的token /term (词),输出是一个词的流token stream
  3. token filters
    token filter 这个名字也直接表达了含义,就是对token stream 进行了add ,remove, change操作

用户可以使用者三个部分来自定义analyzer,在下面的部分我们会分别介绍这三个部分,character filterstokenizerstoken filters

3. character filters

  character filter 的输入是原始的文本text,然后他进行一些addding,removing,change characters 操作。比如将1,2,3,4转成汉语中的一,二,三这种。一个analyzer可以没有character,也可以有多个character filter。目前es自带的character filter 有下面这些

  1. HTML Strip Character Filter : 过滤html标签并进行替换
  2. Mapping Character Filter : 自定义一个map映射,可以进行一些自定义的替换
  3. Pattern Replace Character Filter : 可以按照模式匹配将一些字符串替换为想要的字符

1.HTML Strip Character Filter

1.html_strip字符过滤器功能

从文本中剥离HTML元素,并用其解码值替换HTML实体(例如,将&替换为&)。

在 HTML 中,某些字符是预留的。
在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。
如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。 字符实体类似这样:
&entity_name;

&#entity_number;
如需显示小于号,我们必须这样写:< 或 < 或 <

样例一

POST _analyze
{
  "tokenizer":      "keyword",
  "char_filter":  [ "html_strip" ],
  "text": "<p>I&apos;m so &amp; <b>happy</b>!</p>"
}

返回
{
  "tokens" : [
    {
      "token" : """ I'm so & happy!  """,
      "start_offset" : 0,
      "end_offset" : 38,
      "type" : "word",
      "position" : 0
    }
  ]
}
2.他也允许你配置忽略哪些标签,被忽略的标签将不会被删除

样例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": ["my_char_filter"]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip",
          "escaped_tags": ["b"]
        }
      }
    }
  }
}

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

返回
{
  "tokens" : [
    {
      "token" : """  I'm so <b>happy</b>!  """,
      "start_offset" : 0,
      "end_offset" : 32,
      "type" : "word",
      "position" : 0
    }
  ]
}


2.Mapping Character Filter

映射字符过滤器接受键和值的映射。每当遇到与键相同的字符串时,它将用与该键关联的值替换它们。
匹配是贪婪的;在给定点匹配的最长模式会获胜。允许替换为空字符串。
所以mapping char_filter 不像html_strip那样拆箱即可用,必须先进性配置才能使用mapping char_filter
mapping char_fliter有两个属性可以配置
1.mappings:数组类型,数组中的每一个元素都是key=>value
2.mappings_path: 一个path,用于使用文件存储key=>value的情况


PUT analyze_test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": "mapping_char_filter"
        }
      },
      "char_filter": {
        "mapping_char_filter":{
          "type":"mapping",
          "mappings":[
            "a => aa",
            "b => e",
            "oo => kkm"
            ]
        }
      }
    }
  }
}

POST analyze_test/_analyze
{
  "analyzer":"my_analyzer",
  "text":"a good name is you be"
}


返回
{
  "tokens" : [
    {
      "token" : "aa gkkmd naame is you ee",
      "start_offset" : 0,
      "end_offset" : 21,
      "type" : "word",
      "position" : 0
    }
  ]
}


3.Pattern Replace Character Filter

pattern_replace字符过滤器使用正则表达式来匹配应用指定的替换字符串替换的字符。替换字符串可以引用正则表达式中的捕获组。
同样 pattern_replace char_filter也是先配置后使用,有三个属性
1.pattern: 一个java pattern
2.replacement: 被替换成的字符串
3.flags: java 正则的flag参数 “CASE_INSENSITIVE|COMMENTS”

样例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "(\\d+)-(?=\\d)",
          "replacement": "$1_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "My credit card is 123-456-789"
}

改变了原来的文本有可能导致高亮有些问题,高亮位置显示的有可能不对不对。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值