关于java:Elasticsearch-Analyzer-内置分词器

44次阅读

共计 6152 个字符,预计需要花费 16 分钟才能阅读完成。

Elasticsearch Analyzer 内置分词器

篇次要介绍一下 Elasticsearch 中 Analyzer 分词器的形成 和一些 Es 中内置的分词器 以及如何应用它们

前置常识

es 提供了 analyze api 能够不便咱们疾速的指定 某个分词器 而后对输出的 text 文本进行分词 帮忙咱们学习和试验分词器

POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone]

1.Analyzer

在 ES 中有很重要的一个概念就是 分词 ,ES 的全文检索也是基于分词联合倒排索引做的。所以这一文咱们来看下何谓之分词。如何分词。

分词器是专门解决分词的组件,在很多中间件设计中每个组件的职责都划分的很分明,繁多职责准则,当前改的时候好扩大。
分词器由三局部组成。

  • Character Filters : 次要对原文本做解决, 例如 去除 html 标签
  • Tokenizer : 依照规定 把文本切分为单词, 也就是分词
  • Token Filters : 将切分后的单词 进行加工解决, 小写, 删除 stopwords 进展词, 减少同义词 , 扩大一些

分词场景:

  1. 数据写入 index 的时候进行分词
  2. query 查问时候 须要对查问文本 进行分词

2.Elasticsearch 内置分词器

在 es 中有不少内置分词器

  • Standard Analyzer : 默认分词器, 按 Unicode 文本宰割算法拆分 , 转化为小写 , 反对中文 (然而中文依照每个文字拆分, 没啥意义)
  • Simple Analyzer : 依照非字母切分 并且转化为小写
  • Stop Analyzer : 和 simple 一样 然而多了 过滤停用词 (the a is) 默认应用 stop token filter 的 english 预约义
  • Whitespace Analyzer : 每当遇到 空格的时候 会进行分词 , 不会转小写
  • Keyword Analyzer : 不分词 间接将输出当做输入
  • Patter Analyzer : 正则表达式
  • Language : 语言分词器 30 多种
  • Customer Analyzer : 自定义分词器

3. Standard Analyzer

Standard 是 es 中默认的分词器 , 它是依照 Unicode 文本宰割算法去 对文本进行分词的

POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone]
3.1 Definition

包含了 转小写的 token filter 和 stop token filter 去除进展词

Tokenizer

  • [Standard Tokenizer]

Token Filters

  • [Standard Token Filter] : 没用只是作为保留的 token filter (The standard token filter currently does nothing. It remains as a placeholder in case some filtering function needs to be added in a future version.)
  • [Lower Case Token Filter] : 转小写的 token filter
  • [Stop Token Filter] : 进展词 token filter 默认是没有开启
3.2 Configuration
  • max_token_length : 最大的分词长度, 如果超过此长度 则间接分词 default 255
  • stopwords : 预约义的进展词列表 如: englisth 或者 进展词数组 [] 默认 none 不设置
  • stopwords_path : 蕴含进展词的文件门路
3.3 试验
// 应用 自定义的分词器 基于 standard
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard", 
          "max_token_length": 5, // 最大词数
          "stopwords": "_english_" // 开启过滤进展词 应用 englisth 语法
        }
      }
    }
  }
}


GET my_index/_analyze
{
  "analyzer": "my_english_analyzer",
  "text": "The hellogoodname jack"
}
// 能够看到 最长 5 个字符 就须要进行分词了, 并且进展词 the 没有了
["hello", "goodn", "ame", "jack"]

4. Simple Analyzer

简略的分词器 分词规定就是 遇到 非字母的 就分词, 并且转化为小写,(lowercase tokennizer)

POST _analyze
{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone]
4.1 Definition

Tokenizer

  • Lower Case Tokenizer
4.2 Configuation

无配置参数

4.3 试验

simple analyzer 分词器的实现 就是如下

PUT /simple_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_simple": {
          "tokenizer": "lowercase",
          "filter": []}
      }
    }
  }
}

5. Stop Analyzer

stop analyzer 和 simple analyzer 一样, 只是多了 过滤 stop word 的 token filter , 并且默认应用 english 进展词规定

POST _analyze
{
  "analyzer": "stop",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 能够看到 非字母进行分词 并且转小写 而后 去除了进展词
[quick, brown, foxes, jumped, over, lazy, dog, s, bone]
5.1 Definition

Tokenizer

  • Lower Case Tokenizer : 转小写的

Token filters

  • Stop Token Filter : 过滤进展词 默认应用 规定 english
5.2 Configuration
  • stopwords : 指定分词的规定 默认 english , 或者分词的数组
  • stopwords_path : 指定分词进展词文件
5.3 试验

如下就是对 Stop Analyzer 的实现 , 先转小写 后进行进展词的过滤

PUT /stop_example
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        }
      },
      "analyzer": {
        "rebuilt_stop": {
          "tokenizer": "lowercase",
          "filter": ["english_stop"]
        }
      }
    }
  }
}

设置 stopwords 参数 指定过滤的进展词列表

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[quick, brown, foxes, jumped, lazy, dog, s, bone]

6. Whitespace Analyzer

空格 分词器, 顾名思义 遇到空格就进行分词, 不会转小写

POST _analyze
{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone.]
6.1 Definition

Tokenizer

  • Whitespace Tokenizer
6.2 Configuration

无配置

6.3 试验

whitespace analyzer 的实现就是如下, 能够依据理论状况进行 增加 filter

PUT /whitespace_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_whitespace": {
          "tokenizer": "whitespace",
          "filter": []}
      }
    }
  }
}

7. Keyword Analyzer

很非凡 它不会进行分词, 怎么输出 就怎么输入

POST _analyze
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

// 留神 这里并没有进行分词 而是原样输入
[The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.]
7.1 Definition

Tokennizer

  • Keyword Tokenizer
7.2 Configuration

无配置

7.3 试验

rebuit 如下 就是 Keyword Analyzer 实现

PUT /keyword_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_keyword": {
          "tokenizer": "keyword",
          "filter": []}
      }
    }
  }
}

8. Patter Analyzer

正则表达式 进行拆分 , 留神 正则匹配的是 标记, 就是要被分词的标记 默认是 依照 \w+ 正则分词

POST _analyze
{
  "analyzer": "pattern",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 默认是 依照 \w+ 正则
[the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone]
8.1 Definition

Tokennizer

  • Pattern Tokenizer

Token Filters

  • Lower Case Token Filter
  • Stop Token Filter (默认未开启)
8.2 Configuration
pattern A Java regular expression, defaults to \W+.
flags Java regular expression.
lowercase 转小写 默认开启 true.
stopwords 进展词过滤 默认 none 未开启 , Defaults to _none_.
stopwords_path 进展词文件门路
8.3 试验

Pattern Analyzer 的实现 就是如下

PUT /pattern_example
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "split_on_non_word": {
          "type":       "pattern",
          "pattern":    "\\W+" 
        }
      },
      "analyzer": {
        "rebuilt_pattern": {
          "tokenizer": "split_on_non_word",
          "filter": ["lowercase"]
        }
      }
    }
  }
}

9. Language Analyzer

提供了如下 这么多语言分词器 , 其中 english 也在其中

arabic, armenian, basque, bengali, bulgarian, catalan, czech, dutch, english, finnish, french, galician, german, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, portuguese, romanian, russian, sorani, spanish, swedish, turkish.

GET _analyze
{
  "analyzer": "english",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[2, quick, brown, foxes, jumped, over, lazy, dog, bone]
10. Customer Analyzer

没啥好说的 就是当提供的 内置分词器不满足你的需要的时候 , 你能够联合 如下 3 局部

  • Character Filters : 次要对原文本做解决, 例如 去除 html 标签
  • Tokenizer : 依照规定 把文本切分为单词, 也就是分词
  • Token Filters : 将切分后的单词 进行加工解决, 小写, 删除 stopwords 进展词, 减少同义词 , 扩大一些
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": ["emoticons"],
          "tokenizer": "punctuation", 
          "filter": [
            "lowercase",
            "english_stop" 
          ]
        }
      },
      "tokenizer": {
        "punctuation": { 
          "type": "pattern",
          "pattern": "[.,!?]"
        }
      },
      "char_filter": {
        "emoticons": { 
          "type": "mapping",
          "mappings": [":) => _happy_",
            ":(=> _sad_"]
        }
      },
      "filter": {
        "english_stop": { 
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text":     "I'm a :) person, and you?"
}

[i'm, _happy_, person, you]

总结

本篇次要介绍了 Elasticsearch 中 的一些 内置的 Analyzer 分词器, 这些内置分词器可能不会罕用, 然而如果你能好好梳理一下这些内置 分词器, 肯定会对你了解 Analyzer 有很大的帮忙, 能够帮忙你了解 Character Filters , Tokenizer 和 Token Filters 的用途.

有机会再聊聊 一些中文分词器 如 IKAnalyzer, ICU Analyzer ,Thulac 等等.. 毕竟开发中 中文分词器用到更多些

欢送大家拜访 集体博客 Johnny 小屋
欢送关注集体公众号

正文完
 0