Elasticsearch Analyzer 内置分词器使用示例详解

目录
  • 前置知识
  • 1.Analyzer
  • 2.Elasticsearch 内置分词器
  • 3. Standard Analyzer
    • 3.1 Definition
    • 3.2 Configuration
    • 3.3 实验
  • 4. Simple Analyzer
    • 4.1 Definition
    • 4.2 Configuation
    • 4.3 实验
  • 5. Stop Analyzer
    • 5.1 Definition
    • 5.2 Configuration
    • 5.3 实验
  • 6. Whitespace Analyzer
    • 6.1 Definition
    • 6.2 Configuration
    • 6.3 实验
  • 7. Keyword Analyzer
    • 7.1 Definition
    • 7.2 Configuration
    • 7.3 实验
  • 8. Patter Analyzer
    • 8.1 Definition
    • 8.2 Configuration
    • 8.3 实验
  • 9. Language Analyzer
  • 10. Customer 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 停顿词, 增加同义词 , 扩展一些

分词场景:

  • 数据写入index 的时候进行分词
  • 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 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 也在其中

arabicarmenianbasquebengalibulgariancatalanczechdutchenglishfinnishfrenchgaliciangermanhindihungarianindonesianirishitalianlatvianlithuaniannorwegianportugueseromanianrussiansoranispanishswedishturkish.

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 等等.. 毕竟开发中 中文分词器用到更多些

以上就是Elasticsearch Analyzer 内置分词器使用示例详解的详细内容,更多关于Elasticsearch Analyzer分词器的资料请关注我们其它相关文章!

(0)

相关推荐

  • Elasticsearch mapping 概念及自动创建示例

    目录 正文 1.什么是Mapping 2.es 自动创建mapping 3. mapping 类型自动识别 4. 自定义创建mapping 5. mapping 属性设置analyzer 分词器 6. mapping 属性设置 boost 权重 7. mapping 属性设置 copy_to 8. mapping 属性设置 index 9. mapping 设置 属性 null_value 默认值 10. mapping 设置 dynamic 10.1 dynamic false 10.2 dy

  • Elasticsearch Join字段类型简单快速上手教程

    目录 概述 父子关系的限制 Global ordinals 父子文档 总结 阅读本文需要一定的Elasticsearch基础哦,本文深度有,但是不深 概述 Elasticsearch中Join数据类型的字段相信大家也都用过,也就是口中常谈的父子文档.在Elasticsearch中Join不能跨索引和分片,所以保存文档信息时要保证父子文档使用相同的路由参数来保证父文档与子文档保存在同一个索引的同一个分片,那么都有哪些限制呢? 父子关系的限制 每个索引中只能有一个关系字段 父文档与子文档必须在同一个

  • ElasticSearch写入流程实例解析

    目录 一.前言 二.lucence写 2.1 增删改 2.2. 并发模型 2.2.1. 基本操作 2.2.2 更新 2.2.3 删除 2.2.4 flush和commit 2.2.5 merge 小结 三. ElasticSearch的写 3.1. 宏观看ElasticSearch请求 3.2. 详细流程 3.2.1 协调节点内部流程 3.2.2 主分片节点流程* 3.2.3 副本分片节点流程8 四.总结 一.前言 介绍我们在前面已经知道ElasticSearch底层的写入是基于lucence依

  • 详解如何查看Elasticsearch的Debug日志

    目录 正文 源码分析 apply setting 代码 正文 当我们遇到问题或者需要深入了解 Elasticsearch 的运行机制时,调整日志等级( logging level )到更详细的级别,比如 DEBUG.TRACE ,会是一个有效且必须要掌握的方法. Elasticsearch 提供了如下的接口来支持动态变更 logging level,logger 后面是 package name 或者 class name. PUT _cluster/settings { "persistent

  • ElasticSearch事件查询语言EQL操作

    目录 前述 EQL优点 基础语法 数据准备 数据窗口搜索 统计符合条件的事件 事件序列 安全检测 数据准备 获取regsvr32事件的计数 检查命令行参数 检查恶意脚本加载 检查攻击成功可能性 前述 EQL 的全名是 Event Query Language (EQL).事件查询语言(EQL)是一种用于基于事件的时间序列数据(例如日志,指标和跟踪)的查询语言.在 Elastic Security 平台上,当输入有效的 EQL 时,查询会在数据节点上编译,执行查询并返回结果.这一切都快速.并行地发

  • RediSearch加RedisJSON大于Elasticsearch的搜索存储引擎

    目录 RedisMod简介 安装 RediSearch 对比Elasticsearch 索引能力 查询能力 总结 RedisMod简介 Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用.最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!今天给大家带来RediSearch+RedisJSON作为搜索引擎的使用实践,希望对大家有所帮助! SpringBoot实战

  • Elasticsearch Analyzer 内置分词器使用示例详解

    目录 前置知识 1.Analyzer 2.Elasticsearch 内置分词器 3. Standard Analyzer 3.1 Definition 3.2 Configuration 3.3 实验 4. Simple Analyzer 4.1 Definition 4.2 Configuation 4.3 实验 5. Stop Analyzer 5.1 Definition 5.2 Configuration 5.3 实验 6. Whitespace Analyzer 6.1 Defini

  • 对Django中内置的User模型实例详解

    User模型 User模型是这个框架的核心部分.他的完整的路径是在django.contrib.auth.models.User. 字段 内置的User模型拥有以下的字段: 1.username: 用户名.150个字符以内.可以包含数字和英文字符,以及_.@.+..和-字符.不能为空,且必须唯一! 2.first_name:歪果仁的first_name,在30个字符以内.可以为空. 3.last_name:歪果仁的last_name,在150个字符以内.可以为空. 4.email:邮箱.可以为空

  • Spring Boot 定制与优化内置的Tomcat容器实例详解

    1.Spring Boot 定制与优化内置Tomcat容器. > 内置的容器有三个分别是Undertow.Jetty.Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口都是EmbeddedServletContainerFactory,该接口也是本文的主要核心. 对于内置容器的定制与优化主要有两种方式,第一种方式是通过配置文件来配置,另外一种是通过码代码的方式.接下来主要对上述两种方式进行实现. 2.通过配置文件来定制与优化Tomcat > 配置的核心内容参考org

  • Python常用内置函数和关键字使用详解

    目录 常用内置方法 查看所有的内置类和内置方法 标准输入输出 数学 序列 进制数转换 ASCII字符编码转换 其它 常用关键字 常见内置属性 常用内置方法 在Python中有许许多多的内置方法,就是一些Python内置的函数,它们是我们日常中经常可以使用的到的一些基础的工具,可以方便我们的工作. 查看所有的内置类和内置方法 # 方法一 built_list = dir(__builtins__) # 方法二 import builtins built_list = dir(builtins) 其

  • 关于PHP内置的字符串处理函数详解

    字符串的特点 1.  其他类型的数据用在字符串类型处理函数中,会自动将其转化成字符串后,在处理 <?php echo substr("abcdefghijklmn",2,4),"<br>"; //cdef //使用数字会自动转化为字符串 echo substr(123456,2,4); //3456 ?> 2. 可以将字符串视为数组,当做字符集合来看待 <?php $str="abcdefg"; //下面这两种方法都

  • 基于python内置函数与匿名函数详解

    内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() pow() super

  • python内置函数之slice案例详解

    英文文档: class slice(stop) class slice(start, stop[, step]) Return a slice object representing the set of indices specified by range(start, stop, step). The start and step arguments default to None. Slice objects have read-only data attributes start, st

  • 表格梳理python内置数学模块math分析详解

    python内置数学模块math 提供了一些基础的计算功能,下列表达式默认 from math import * 默认输入输出均为一个数字.大部分函数都很直观,望文生义即可. 其他函数 isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) 若 a 和 b 的值比较接近则返回True,否则False. rel_tol 是相对容差,表示a, b之间允许的最大差值.例如,要设置5%的容差,rel_tol=0.05.rel_tol 必须大于0. abs_tol 是最小

  • Vue3内置组件Teleport使用方法详解

    目录 1.Teleport用法 2.完成模态对话框组件 3.组件的渲染 前言: Vue 3.0 新增了一个内置组件 teleport ,主要是为了解决以下场景: 有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app 之外的其他位置 场景举例:一个 Button ,点击后呼出模态对话框 这个模态对话框的业务逻辑位置肯定是属于这个 Button ,但是按照 DOM 结构来看,模态对话框的实际位置应该在整个应用的中间 这样就有了一个问题:组件的

  • Python使用自定义装饰器的示例详解

    在Python自动化测试中,使用自定义的装饰器来给测试方法传递测试数据: reader.py import csv import json from openpyxl import load_workbook from setting import DATA_DIR from os import path class Reader: @classmethod def read_excel(cls,xlname, min_row, max_row, min_col, max_col): xlnam

随机推荐