elasticsearch:分析器

Leo_wlCnBlogs Leo_wlCnBlogs     2022-08-31     538

关键词:

ElasticSearch入门 第七篇:分析器

这是ElasticSearch 2.4 版本系列的第七篇:

 

在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本、在原始文本中的开始和结束偏移量、以及数据类型等组成。ElasticSearch 把文档数据写到倒排索引(Inverted Index)的结构中,倒排索引建立词(Term)和文档之间的映射,索引中的数据是面向词,而不是面向文档的。分析器(Analyzer)的作用就是分析(Analyse),用于把传入Lucene的文档数据转化为倒排索引,把文本处理成可被搜索的词。分析器由一个分词器(Tokenizer)和零个或多个标记过滤器(TokenFilter)组成,也可以包含零个或多个字符过滤器(Character Filter)。

在ElasticSearch引擎中,分析器的任务是分析(Analyze)文本数据,分析是分词,规范化文本的意思,其工作流程是:

  • 首先,字符过滤器对分析(analyzed)文本进行过滤和处理,例如从原始文本中移除HTML标记,根据字符映射替换文本等,
  • 过滤之后的文本被分词器接收,分词器把文本分割成标记流,也就是一个接一个的标记,
  • 然后,标记过滤器对标记流进行过滤处理,例如,移除停用词,把词转换成其词干形式,把词转换成其同义词等,
  • 最终,过滤之后的标记流被存储在倒排索引中;
  • ElasticSearch引擎在收到用户的查询请求时,会使用分析器对查询条件进行分析,根据分析的结构,重新构造查询,以搜索倒排索引,完成全文搜索请求,

可见,分析器扮演的是处理索引数据和查询条件的重要角色。在2.4版本中,ElasticSearch 预定义了7个分析器,并且支持用户根据预定义的字符过滤器,分词器和标记过滤器创建自定义的分析器,以满足用户多样性的文本分析需求。

用户在创建索引时配置索引的分析,通过向ElasticSearch发送请求,在请求body的settings 配置节中设置索引的分析器,例如,为索引配置默认的分析器:

复制代码
"settings":{  
    "index":{
        "analysis":{
            "analyzer":{
                "default":{
                    "type":"standard"
                    ,"stopwords":"_english_"
                }
            }
        }
    }
}
复制代码

一,字符过滤器(Char Filter)

字符过滤器对未经分析的文本起作用,作用于被分析的文本字段(该字段的index属性为analyzed),字符过滤器在分词器之前工作,用于从文档的原始文本去除HTML标记(markup),或者把字符“&”转换为单词“and”。ElasticSearch 2.4版本内置3个字符过滤器,分别是:映射字符过滤器(Mapping Char Filter)、HTML标记字符过滤器(HTML Strip Char Filter)和模式替换字符过滤器(Pattern Replace Char Filter)。

1,映射字符过滤器

映射字符过滤器,类型是mapping,需要建立一个查找字符和替换字符的映射(Mapping),过滤器根据映射把文本中的字符替换成指定的字符。

 View Code

2,HTML标记字符过滤器

HTML标记字符过滤器,类型是html_strip,用于从原始文本中去除HTML标记。

3,模式替换字符过滤器

模式替换字符过滤器,类型是pattern_replace,它使用正则表达式(Regular Expression)匹配字符,把匹配到的字符替换为指定的替换字符串。

 View Code

pattern参数:指定Java正则表达式;

replacement参数:指定替换字符串,把正则表达式匹配的字符串替换为replacement参数指定的字符串;

二,分词器(Tokenizer)

分词器在字符过滤器之后工作,用于把文本分割成多个标记(Token),一个标记基本上是词加上一些额外信息,分词器的处理结果是标记流,它是一个接一个的标记,准备被过滤器处理。ElasticSearch 2.4版本内置很多分词器,本节简单介绍常用的分词器。

1,标准分词器(Standard Tokenizer)

标准分词器类型是standard,用于大多数欧洲语言,使用Unicode文本分割算法对文档进行分词。

2,字母分词器(Letter Tokenizer)

字符分词器类型是letter,在非字母位置上分割文本,这就是说,根据相邻的词之间是否存在非字母(例如空格,逗号等)的字符,对文本进行分词,对大多数欧洲语言非常有用。

3,空格分词器(Whitespace Tokenizer)

空格分词类型是whitespace,在空格处分割文本

4,小写分词器(Lowercase Tokenizer)

小写分词器类型是lowercase,在非字母位置上分割文本,并把分词转换为小写形式,功能上是Letter Tokenizer和 Lower Case Token Filter的结合(Combination),但是性能更高,一次性完成两个任务。

5,经典分词器(Classic Tokenizer)

经典分词器类型是classic,基于语法规则对文本进行分词,对英语文档分词非常有用,在处理首字母缩写,公司名称,邮件地址和Internet主机名上效果非常好。

三,标记过滤器(Token Filter)

分析器包含零个或多个标记过滤器,标记过滤器在分词器之后工作,用来处理标记流中的标记。标记过滤从分词器中接收标记流,能够删除标记,转换标记,或添加标记。ElasticSearch 2.4版本内置很多标记过滤器,本节简单介绍常用的过滤器。

1,小写标记过滤器(Lowercase)

类型是lowercase,用于把标记转换为小写形式,通过language参数指定语言,小写标记过滤器支持的语言有:Greek, Irish, and Turkish

 View Code

2,停用词标记过滤器(Stopwords)

类型是stop,用于从标记流中移除停用词。参数stopwords用于指定停用词,ElasticSearch 2.4版本提供的预定义的停用词列表:预定义的英语停用词是_english_,使用预定义的英语停用词列表是  “stopwords” :"_english_"

复制代码
PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "my_stop": {
                    "type":       "stop",
                    "stopwords": ["and", "is", "the"]
                }
            }
        }
    }
}
复制代码

3,词干过滤器(Stemmer)

类型是stemmer,用于把词转换为其词根形式存储在倒排索引,能够减少标记。

 View Code

4,同义词过滤器(Synonym)

类型是synonym,在分析阶段,基于同义词规则,把词转换为其同义词存储在倒排索引中

 View Code

同义词文件的格式示例:

 View Code

四,系统预定义的分析器

在创建索引映射时引用分析器,如果没有定义分析器,那么ElasticSearch将使用默认的分析器,用户可以通过API设置默认的分析器。

default 逻辑名称用于配置在索引和搜索时使用的分析器,default_search 逻辑名称用于配置在搜索时使用的分析器。

index :
  analysis :
    analyzer :
      default :
        tokenizer : keyword

1,标准分析器(Standard)

分析器类型是standard,由标准分词器(Standard Tokenizer),标准标记过滤器(Standard Token Filter),小写标记过滤器(Lower Case Token Filter)和停用词标记过滤器(Stopwords Token Filter)组成。参数stopwords用于初始化停用词列表,默认是空的。

2,简单分析器(Simple)

分析器类型是simple,实际上是小写标记分词器(Lower Case Tokenizer),在非字母位置上分割文本,并把分词转换为小写形式,功能上是Letter Tokenizer和 Lower Case Token Filter的结合(Combination),但是性能更高,一次性完成两个任务。

3,空格分析器(Whitespace)

分析器类型是whitespace,实际上是空格分词器(Whitespace Tokenizer)。

4,停用词分析器(Stopwords)

分析器类型是stop,由小写分词器(Lower Case Tokenizer)和停用词标记过滤器(Stop Token Filter)构成,配置参数stopwords 或 stopwords_path指定停用词列表。

5,雪球分析器(Snowball)

分析器类型是snowball,由标准分词器(Standard Tokenizer),标准过滤器(Standard Filter),小写过滤器(Lowercase Filter),停用词过滤器(Stop Filter)和雪球过滤器(Snowball Filter)构成。参数language用于指定语言。

 View Code

6,自定义分析器

分析器类型是custom,允许用户定制分析器。参数tokenizer 用于指定分词器,filter用于指定过滤器,char_filter用于指定字符过滤器。

 View Code

五,查询分析

在分析(_ayalyze)端点上执行分析查询,用于对查询参数进行分析,并返回分析的结果

1,使用默认的分析器执行查询分析

例如,在索引ebrite上执行分析查询,分析字符“After School”,从返回的结果中,可以看到两个标记(Token):“after”和“school”,类型(type)是字符数字类型(<ALPHANUM>),偏移量(offset)从1开始计数,位置(position)从0开始计数。

POST myindex/_analyze -d
"After School"

2,指定分析器

POST myindex/_analyze?analyzer=standard -d
"After School"

3,指定分词器和过滤器

POST myindex/_analyze?tokenizer=standard&filters=lowercase -d
"After School"

4,在特定的字段上执行分析查询

POST myindex/_analyze?field=doc_field&tokenizer=standard&filters=lowercase -d
"After School"

 

附,在创建索引时,指定默认的分析器

示例代码,使用PUT动词,在创建索引时指定默认的分析器,ElasticSearch引擎在索引文档时,使用默认的分析器对index属性为analyzed的文本字段执行分析操作,而非分析字段,将不会应用分析操作。

 View Code

 

参考文档:

Elasticsearch: Analyzing Text with the Analyze API

Elasticsearch: The Definitive Guide [2.x] » Dealing with Human Language

Elasticsearch Reference [2.4] » Analysis

--业精于勤而荒于嬉,行成于思而毁于随--

ElasticSearch 和 Porterstem 分析器

】ElasticSearch和Porterstem分析器【英文标题】:ElasticSearchandPorterstemanalyser【发布时间】:2011-07-1919:52:42【问题描述】:我正在考虑使用Elasticsearch来提供我们网站的搜索功能。我一直在试验它,但无法启用Porterstem分析器(以便搜索... 查看详情

elasticsearch分析器结构组成

在使用ElasticSearch过程中,一般中文使用IK分词器,英文使用默认的分词器即可,但是对于上述分词器满足不了需求的情况下,需要自定义分析器。以下思维导图包含ES分析器的结构和内置的一些组件:   查看详情

elasticsearch自定义分析器-集成结巴分词插件

关于结巴分词ElasticSearch插件:https://github.com/huaban/elasticsearch-analysis-jieba该插件由huaban开发。支持ElasticSearch版本<=2.3.5。结巴分词分析器结巴分词插件提供3个分析器:jieba_index、jieba_search和jieba_other。jieba_index:用于索引分词,分... 查看详情

elasticsearch日志分析系统

...                         Elasticsearch日志分析系统                                              作者:尹正杰版权声明:原创作品,谢绝... 查看详情

elasticsearch自定义多个分析器(代码片段)

分析器(Analyzer)Elasticsearch无论是内置分析器还是自定义分析器,都由三部分组成:字符过滤器(CharacterFilters)、分词器(Tokenizer)、词元过滤器(TokenFilters)。分析器Analyzer工作流程:InputText=>CharacterFilters(如果有多个,按顺序应用)=>... 查看详情

日志分析系统elk之elasticsearch(代码片段)

Elasticsearch什么是ELKElasticsearchElasticsearch基础模块elasticsearch应用场景Elasticsearch单节点部署Elasticsearch集群的部署集群简介elasticsearch节点角色集群部署可视化工具cerebro可视化工具elasticsearch-head插件索引、分片和副本Elasticsearch节点优... 查看详情

日志分析系统elk之elasticsearch(代码片段)

Elasticsearch什么是ELKElasticsearchElasticsearch基础模块elasticsearch应用场景Elasticsearch单节点部署Elasticsearch集群的部署集群简介elasticsearch节点角色集群部署可视化工具cerebro可视化工具elasticsearch-head插件索引、分片和副本Elasticsearch节点优... 查看详情

elasticsearch:通过结合elasticsearch词干分析器和同义词来提高搜索相关性(代码片段)

在之前的博客中,我们介绍了如何将同义词合并到由Elasticsearch驱动的应用程序中。在这里,我以该博客为基础,展示了如何结合词干分析器(stemmer)和多词同义词(multi-wordsynonyms),将搜索结果的... 查看详情

运维实操——日志分析系统elk(上)之elasticsearch(代码片段)

日志分析系统ELK(上)之elasticsearch1、什么是elasticsearch?2、单节点elasticsearch安装3、搭建elasticsearch集群4、elasticsearch可视化方法1——cerebro插件5、elasticsearch可视化方法2——elasticsearch-head插件6、elasticsearch节点角色E 查看详情

企业运维之elk日志分析平台(elasticsearch)(代码片段)

ELK日志分析平台--Elasticsearch的介绍与安装1.ELK介绍2.Elasticsearch简介3.Elasticsearch的部署3.1单机模式3.2Elasticsearch集群3.3cerebro图形化3.4Elasticsearch-head图形化3.5索引、分片和副本3.6Elasticsearch节点优化1.ELK介绍ELK指的是⼀套完整的⽇志集... 查看详情

elk日志分析平台搭建----elasticsearch

ELK日志分析平台搭建----ELASTICSEARCH介绍:ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成1、Elasticsearch是一个开源分布式的搜索引擎,特点是:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口,多数据... 查看详情

elasticsearch聚合分析(代码片段)

...的统计指标,我们以观看日志分析为例,介绍各种常用的ElasticSearch聚合操作。目录:查询用户观看视频数和观看时长聚合分页器查询视频uv单个视频uv批量查询视频uvHaving查询根据count进行过滤根据其它指标进行过滤首先展示一下... 查看详情

elk日志分析平台之elasticsearch(代码片段)

目录elasticsearch简介一ES安装与集群部署1单节点elasticsearch安装2搭建elasticsearch集群二elasticsearch集群监控--可视化1elasticsearch-head插件2cerebro插件三ES节点角色1elasticsearch节点优化方式2设定集群中某节点不存储数据,role角色无data... 查看详情

Elasticsearch 中的分析

】Elasticsearch中的分析【英文标题】:AnalyticsinElasticsearch【发布时间】:2014-09-1702:59:34【问题描述】:我正在处理事件分析,我使用hadoop处理日志并将一些结果存储在Mysql中。由于日志每天都在不断出现,因此由于可扩展性问题,... 查看详情

elasticsearch-基础介绍及索引原理分析(代码片段)

最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elasticsearch感兴趣/想了解的同学有所帮助。同时也希望有发... 查看详情

[elasticsearch]3.信息输出:搜索分析(代码片段)

信息输出:搜索分析连载中...Informationout:searchandanalyze之所以能够使用Elasticsearch存储检索文档数据和它们的元数据还要感谢底层的搜索引擎Lucene.WhileyoucanuseElasticsearchasadocumentstoreandretrievedocumentsandtheirmetadata,therealpowercomesfrom 查看详情

使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?

】使用NEST的Elasticsearch:如何配置分析器来查找部分单词?【英文标题】:ElasticsearchusingNEST:Howtoconfigureanalyzerstofindpartialwords?【发布时间】:2012-12-0914:15:00【问题描述】:我正在尝试按部分单词进行搜索,忽略大小写并忽略某些... 查看详情

技术分析|浅析mysql与elasticsearch的组合使用(代码片段)

...不得随意使用,转载请联系小编并注明来源。1.导入2.ElasticSearch入门2.1.ElasticSearch介绍2.2.ElasticSearch的安装2.3.ElasticSearch概念入门2.4.ElasticSearch简单操作2.5.MySQL与ElasticSearch的实际应用3.小结1.导入假设有一业务场景: 查看详情