elasticseach自定义analyzer分析器

我们可以自定义一个analyzer,在此之前我们首先应该搞懂, char filter tokenizerfilter。自定义分词器是一个上游的组装容器,拼接这3个方法,包括过滤关键字的规则,如何分词,怎么过滤特征词等等

#多字段属性

  • 厂商名字实现精确匹配
    • 增加一个keyword字段
  • 使用不同的analyzer
    • 不同语言
    • Pinyin字段搜索
    • 为索引和索引指定不同的analyzer

Exact Values 和 Full Text

  • Exact Values 不分词
    • elasticseach 中的 keyword
  • 全文本,非结构化的文本数据 会分词匹配
    • elasticseach 中的 text

自定义分词

当elasticsearch自带的分词器无法满足时,可以自定义分词器。通过自组合不同的组件实现,分析器是三个顺序执行的组件的结合(字符过滤器、分词器、表征过滤器)

  • char_filter 字符过滤器
  • tokenizer 分词器
  • filter 特征过滤器

char_filter

  • 在Tokenizer之前对文本进行处理,例如增加删除及替换字符。可以配置多个Character Filters。会影响Tokenizer的position和offset信息。

  • 一些自带的 Character Filters

    • HTML strip 去除html标签
    1
    2
    3
    4
    5
    6
    7
    POST _analyze
    {
    "tokenizer": "standard"
    , "char_filter": ["html_strip"]

    , "text": ["<a href='#'>aaaa</a>"]
    }
    • Mapping 字符串替换
1
2
3
4
5
6
7
8
9
10
11
 POST _analyze
{
"tokenizer": "standard",
"char_filter": [
{
"type":"mapping",
"mappings":["-=>_"]
}
],
"text":"123-asdsd!"
}
* Pattern replace 正则匹配替换
1
2
3
4
5
6
7
8
9
10
11
12
 POST _analyze
{
"tokenizer": "standard",
"char_filter": [
{
"type" : "pattern_replace",
"pattern" : "http://(.*)",
"replacement":"$1"
}
],
"text": "http://www.qq.com"
}

Tokenizer (分词器)

  • 将原始的文本按照一定规则,切分为词(trem or token)elasticsearch 内置的 tokenizers如下

    • whitespace 空格分词

      1
      2
      3
      4
      5
      6
      POST _analyze
      {
      "tokenizer": "whitespace",
      "filter": ["lowercase"],
      "text": "xxxooo ooo 111"
      }
    • standard 标准

    • uax_url_email emil/url 方式分词

    • pattern 正则分词

  • keyword 字符串不分词查找

  • path hierarchy 路径查找

     
    1
    2
    3
    4
    5
    POST _analyze
    {
    "tokenizer": "path_hierarchy",
    "text": "a/b/c/d/e/f"
    }

Filter

  • 将 Tokenizer输出的单词(term),进行增加,修改,删除
  • 自带的Token Filters

自定义analyzer

官方文档

固定格式

1
2
3
4
5
6
7
8
9
10
11
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": { 字符过滤器 },
"tokenizer": { 分词器 },
"filter": { 特征过滤器 },
"analyzer": { 组合 }
}
}
}

eg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
PUT my_test_index
{
"settings": {
"analysis": {
"char_filter":{
"&_to_and": {
"type" : "mapping",
"mappings" : [ "&=> and " ]
}

},
"filter": {
"my_fil":{
"type":"stop",
"stopwords": [ "the", "a" ]
}
},
"analyzer":{
"my_analyzer" : {
"type": "custom",
"char_filter":["&_to_and"],
"tokenizer": "standard",
"filter" : ["my_fil"]
}
}
}
}
}

测试

1
2
3
4
5
POST my_test_index/_analyze
{
"analyzer": "my_analyzer",
"text": "I love PHP&JAVA the ZJJ"
}

  • & 转换成 and
  • the 过滤掉

实验成功

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~