首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch分词:自定义分词器

Elasticsearch分词:自定义分词器

原创
作者头像
HLee
修改于 2021-08-13 09:38:41
修改于 2021-08-13 09:38:41
8K10
代码可运行
举报
文章被收录于专栏:房东的猫房东的猫
运行总次数:0
代码可运行

简介

虽然Elasticsearch带有一些现成的分析器,然而在分析器上Elasticsearch真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单元过滤器来创建自定义的分析器。

分析与分析器 我们说过,一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:

字符过滤器

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-charfilters.html

字符过滤器 用来 整理 一个尚未被分词的字符串。例如,如果我们的文本是HTML格式的,它会包含像 <p> 或者 <div> 这样的HTML标签,这些标签是我们不想索引的。我们可以使用 html清除 字符过滤器 来移除掉所有的HTML标签,并且像把 &Aacute; 转换为相对应的Unicode字符 Á 这样,转换HTML实体。

一个分析器可能有0个或者多个字符过滤器。处理原始文本,可以配置多个,会影响到tokenizer的position和offset信息。在es中有几个默认的字符过滤器

  • html_strip:去除html标签
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /_analyze
{
  "tokenizer": "keyword",
  "char_filter": ["html_strip"],
  "text": "<br>you know, for search</br>"
}

分词效果:
{
  "tokens" : [
    {
      "token" : """
                you know, for search
                """,
      "start_offset" : 0,
      "end_offset" : 29,
      "type" : "word",
      "position" : 0
    }
  ]
}
  • mapping:字符串替换
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /_analyze
{
  "tokenizer": "whitespace",
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [
        "- => "
      ]
    },
    "html_strip"
  ],
  "text": "<br>中国-北京 中国-台湾 中国-人民</br>"
}

分词效果:
{
  "tokens" : [
    {
      "token" : "中国北京",
      "start_offset" : 4,
      "end_offset" : 9,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "中国台湾",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "中国人民",
      "start_offset" : 16,
      "end_offset" : 21,
      "type" : "word",
      "position" : 2
    }
  ]
}
  • pattern_replace:正则匹配替换
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /_analyze
{
  "tokenizer": "keyword",
  "char_filter": [
    {
      "type": "pattern_replace",
      "pattern": "https?://(.*)",
      "replacement": "$1"
    }
  ],
  "text": "https://www.elastic.co"
}

分词效果:
{
  "tokens" : [
    {
      "token" : "www.elastic.co",
      "start_offset" : 0,
      "end_offset" : 22,
      "type" : "word",
      "position" : 0
    }
  ]
}

分词器

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html

一个分析器 必须 有一个唯一的分词器。 分词器把字符串分解成单个词条或者词汇单元。 标准 分析器里使用的 标准 分词器 把一个字符串根据单词边界分解成单个词条,并且移除掉大部分的标点符号,然而还有其他不同行为的分词器存在。

例如, 关键词 分词器 完整地输出 接收到的同样的字符串,并不做任何分词。 空格 分词器 只根据空格分割文本 。 正则 分词器 根据匹配正则表达式来分割文本 。

将原始文本按照一定规则,切分成词项(字符处理)。在es中有几个默认的分词器。

  • standard
  • letter
  • lowercase
  • whitespace
  • uax url email
  • classic
  • thai
  • n-gram
  • edge n-gram
  • keyword
  • pattern
  • simple
  • char group
  • simple pattern split
  • path
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /_analyze
{
  "tokenizer": "path_hierarchy",
  "text": ["/usr/local/bin/java"]
}

分词效果:
{
  "tokens" : [
    {
      "token" : "/usr",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "/usr/local",
      "start_offset" : 0,
      "end_offset" : 10,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "/usr/local/bin",
      "start_offset" : 0,
      "end_offset" : 14,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "/usr/local/bin/java",
      "start_offset" : 0,
      "end_offset" : 19,
      "type" : "word",
      "position" : 0
    }
  ]
}

分词过滤

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html

经过分词,作为结果的 词单元流 会按照指定的顺序通过指定的词单元过滤器 。

词单元过滤器可以修改、添加或者移除词单元。我们已经提到过 lowercase stop 词过滤器 ,但是在 Elasticsearch 里面还有很多可供选择的词单元过滤器。 词干过滤器 把单词 遏制 为 词干。 ascii_folding 过滤器移除变音符,把一个像 "très" 这样的词转换为 "tres"ngramedge_ngram 词单元过滤器 可以产生 适合用于部分匹配或者自动补全的词单元。

将tokenizer输出的词项进行处理,如:增加,修改,删除。在es中有几个默认的分词过滤器。

  • lowercase
  • stop
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": ["stop"],
  "text": ["how are you i am fine thank you"]
}
  • uppercase
  • reverse
  • length
  • n-gram
  • edge n-gram
  • pattern replace
  • trim

自定义分词器

analysis下的相应位置设置字符过滤器、分词器和词单元过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": { ... custom character filters ... },
            "tokenizer":   { ... custom tokenizers ... },
            "filter":      { ... custom token filters ... },
            "analyzer":    { ... custom analyzers ... }
        }
    }
}

作为示范,让我们一起来创建一个自定义分析器吧,这个分析器可以做到下面的这些事:

  • 使用 html清除 字符过滤器移除HTML部分。
  • 使用一个自定义的 映射 字符过滤器把 & 替换为 " and "
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"char_filter": {
    "&_to_and": {
        "type":       "mapping",
        "mappings": [ "&=> and "]
    }
}
  • 使用 标准 分词器分词。
  • 小写词条,使用 小写 词过滤器处理。
  • 使用自定义 停止 词过滤器移除自定义的停止词列表中包含的词:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"filter": {
    "my_stopwords": {
        "type":        "stop",
        "stopwords": [ "the", "a" ]
    }
}

我们的分析器定义用我们之前已经设置好的自定义过滤器组合了已经定义好的分词器和过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"analyzer": {
    "my_analyzer": {
        "type":           "custom",
        "char_filter":  [ "html_strip", "&_to_and" ],
        "tokenizer":      "standard",
        "filter":       [ "lowercase", "my_stopwords" ]
    }
}

完整的创建索引请求 看起来应该像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
{
    "settings":{
        "analysis":{
            "char_filter":{
                "&_to_and":{
                    "type":"mapping",
                    "mappings":[
                        "&=> and "
                    ]
                }
            },
            "filter":{
                "my_stopwords":{
                    "type":"stop",
                    "stopwords":[
                        "the",
                        "a"
                    ]
                }
            },
            "analyzer":{
                "my_analyzer":{
                    "type":"custom",
                    "char_filter":[
                        "html_strip",  // 跳过HTML标签
                        "&_to_and"  // 将&符号转换为"and"
                    ],
                    "tokenizer":"standard",
                    "filter":[
                        "lowercase",  // // 转换为小写
                        "my_stopwords"
                    ]
                }
            }
        }
    }
}

索引被创建以后,使用analyzeAPI 来 测试这个新的分析器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET my_index/_analyze      
{
    "analyzer": "my_analyzer",   
    "text": "The quick & brown fox"
}

分析效果:
{
  "tokens" : [
    {
      "token" : "quick",
      "start_offset" : 4,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "and",
      "start_offset" : 10,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "brown",
      "start_offset" : 12,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "fox",
      "start_offset" : 18,
      "end_offset" : 21,
      "type" : "<ALPHANUM>",
      "position" : 4
    }
  ]
}

完整的创建索引请求 看起来应该像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT /my_analysis
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "char_filter": [
            "my_char_filter"
            ],
          "tokenizer": "my_tokenizer",
          "filter": [
            "my_tokenizer_filter"
            ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": ["_ => "]
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": "[,.!? ]"
        }
      },
      "filter": {
        "my_tokenizer_filter": {
          "type": "stop",
          "stopword": "__english__"
        }
      }
    }
  }
}

索引被创建以后,使用analyzeAPI 来 测试这个新的分析器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /my_analysis/_analyze
{
  "analyzer": "my_analyzer",
  "text": ["Hello Kitty!, A_n_d you?"]
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
大佬,java 使用restclient方式该怎么实现呢
大佬,java 使用restclient方式该怎么实现呢
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Elasticsearch 默认分词器和中分分词器之间的比较及使用方法
转载出处:https://zhuanlan.zhihu.com/p/29183128 介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
皇上得了花柳病
2020/05/18
4.1K0
ElasticSearch权威指南学习(索引管理)
"char_filter": { "&_to_and": { "type": "mapping", "mappings": [ "&=> and "] } }
老梁
2019/09/10
5170
ElasticSearch 多种分析器
Elasticsearch 还附带了可以直接使用的预包装的分析器。接下来我们会列出最重要的分析器。为了证明它们的差异,我们看看每个分析器会从下面的字符串得到哪些词条,先给出词条例子:
用户9615083
2022/12/25
1.2K0
ElasticSearch 多种分析器
Elasticsearch 的分词运用
每个全文索引都是一个倒排索引,ES 在进行检索操作时,会建立倒排索引,将拆分的词进行处理,提高索引命中率。
shanizeng
2020/06/11
1.4K0
ES 分词器相关
规范化,主要实在ES对文本类型进行分词后,按照各自分词器的规范标准,对分词进行二次处理的过程.如was=>is(时态转换),brother‘s=>brother(复数变单数),Watch=>watch(大小写转换)等等,且还可能去掉量词a、an,is等和搜索无关的词语,不同的分词器规范化的过程不一样
郑小超.
2022/09/21
3780
ES 字符过滤器&令牌过滤器
其作用主要是在调用分词器进行分词之前,进行一些无用字符的过滤,字符过滤器主要分为以下三种
郑小超.
2022/09/21
1.5K0
ES 字符过滤器&令牌过滤器
触类旁通Elasticsearch:分析
分析(analysis)是在文档被发送并加入倒排索引之前,ES在其主体上进行的操作。在文档被加入索引之前,ES让每个被分析字段经过一系列的处理步骤。
用户1148526
2019/05/25
1.5K0
Elasticsearch 常用分词器介绍与 ik 分词器自定义词库添加
Elasticsearch 是一个基于 Lucene 的搜索服务器,拥有非常强大的全文检索能力。 用户完全可以通过搭建一个 Elasticsearch 集群来实现搜索引擎的基本功能。 但是,Elasticsearch 本身并不支持中文分词,但好在他支持编写和安装额外的分词管理插件,而开源的中文分词器 — ik 就非常强大,具有20万以上的常用词库,可以满足一般的常用分词功能。 本文,我们就来介绍如何安装 ik 分词库,如何为 ik 分词库添加自定义词库。
用户3147702
2022/06/27
2.7K0
Elasticsearch 常用分词器介绍与 ik 分词器自定义词库添加
Elasticsearch从入门到放弃:分词器初印象
Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来继续更新。
Jackeyzhe
2020/07/03
5960
elasticsearch倒排索引与分词
单词词典的实现一般用B+树,B+树构造的可视化过程网址: B+ Tree Visualization
小旋锋
2019/01/21
1.6K0
学好Elasticsearch系列-分词器
在Elasticsearch中,分词器是用于将文本数据划分为一系列的单词(或称之为词项、tokens)的组件。这个过程是全文搜索中的关键步骤。
BookSea
2023/08/08
5610
学好Elasticsearch系列-分词器
一起学 Elasticsearch 系列-分词器
在Elasticsearch中,分词器是用于将文本数据划分为一系列的单词(或称之为词项、tokens)的组件。这个过程是全文搜索中的关键步骤。
BookSea
2023/11/27
5900
一起学 Elasticsearch 系列-分词器
018.Elasticsearch分词器原理及使用
默认分词器:按照非字母和非数字字符进行分隔,单词转为小写 测试文本:a*B!c d4e 5f 7-h 分词结果:a、b、c、d4e、5f、7、h
CoderJed
2020/07/06
1.5K0
ElasticSearch 小白从入门到精通
ElasticSearch 简称为 ES,ES 是一个分布式的开源搜索和分析引擎,适用于文本、数字、地理空间、结构化数据、非结构化数据等数据的搜索。ES 是在 Apache Lucene 的基础上完成开发。由 Elastic 于 2010 年发布。ES 通过其简单的 REST 风格的 API、分布式特性、速度和可扩容闻名世界。是 Elastic Stack 的核心组件。Elastic Stack 是一套用于数据采集、扩充、保存、分析、可视化的开源工具。Elastic Stack 称之为 ELK。目前 ELK 包含一系列丰富的轻量数据采集代理,这些代理被称之为 Beats。
写bug的高哈哈
2024/03/21
3520
ElasticSearch 小白从入门到精通
ElasticSearch 分词器,了解一下
这篇文章主要来介绍下什么是 Analysis ,什么是分词器,以及 ElasticSearch 自带的分词器是怎么工作的,最后会介绍下中文分词是怎么做的。
武培轩
2020/03/09
2.6K0
ElasticSearch 分词器,了解一下
Elasticsearch自定义分词,从一个问题说开去
设计索引的Mapping阶段,要根据业务用途确定是否需要分词,如果不需要分词,建议设置keyword类型;需要分词,设置为text类型并指定分词器。
铭毅天下
2019/05/08
1.4K0
Elasticsearch自定义分词,从一个问题说开去
ElasticSearch系列05:倒排序索引与分词Analysis
假设我们的文章的储存结果如上,对于关系型数据库mysql来说,普通的索引结构就是“id->题目->内容”,在我们搜索的时候,如果我们知道id或者题目,那么检索效率是很高效的,因为“id”、“题目”是很方便创建索引的。
方才编程_公众号同名
2020/11/12
1.1K0
ElasticSearch系列05:倒排序索引与分词Analysis
Elasticsearch之索引管理、自定义分析器、地理坐标点
Elasticsearch权威指南-索引管理 我们之前的index都是在创建document,让es自动帮我们创建index。现在我们来讲解如何手动创建index,以便更好适用我们的应用。
丁D
2022/08/12
5220
Elasticsearch Analyzer
Elasticsearch全文检索的核心是Text Analysis,而Text Analysis由Analyzer实现。
程序猿杜小头
2022/12/01
6270
Docker环境下配置Es自定义分词器(ik)
一个 tokenizer(分词器)接收一个字符流,将之分割为独立的 tokens(词元,通常是独立 的单词),然后输出 tokens 流。 例如,whitespace tokenizer 遇到空白字符时分割文本。它会将文本 "Quick brown fox!" 分割 为 [Quick, brown, fox!]。 该 tokenizer(分词器)还负责记录各个 term(词条)的顺序或 position 位置(用于 phrase 短 语和 word proximity 词近邻查询),以及 term(词条)所代表的原始 word(单词)的 start(起始)和 end(结束)的 character offsets(字符偏移量)(用于高亮显示搜索的内容)。
一个风轻云淡
2023/10/15
6250
Docker环境下配置Es自定义分词器(ik)
相关推荐
Elasticsearch 默认分词器和中分分词器之间的比较及使用方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档