ES-分词器(Analyzer)

把输入的文本块按照一定的策略进行分解,并建立倒排索引。在Lucene的架构中,这个过程由分析器(analyzer)完成。

主要组成

  • character filter:接收原字符流,通过添加、删除或者替换操作改变原字符流。例如:去除文本中的html标签,或者将罗马数字转换成阿拉伯数字等。一个字符过滤器可以有零个或者多个

  • tokenizer:简单的说就是将一整段文本拆分成一个个的词。例如拆分英文,通过空格能将句子拆分成一个个的词,但是对于中文来说,无法使用这种方式来实现。在一个分词器中,有且只有一个tokenizeer

  • token filters:将切分的单词添加、删除或者改变。例如将所有英文单词小写,或者将英文中的停词a删除等。在token filters中,不允许将token(分出的词)position或者offset改变。同时,在一个分词器中,可以有零个或者多个token filters.

索引和搜索分词

文本分词会发生在两个地方:

  • 创建索引:当索引文档字符类型为text时,在建立索引时将会对该字段进行分词。

  • 搜索:当对一个text类型的字段进行全文检索时,会对用户输入的文本进行分词。

配置分词器

默认ES使用standard analyzer,如果默认的分词器无法符合你的要求,可以自己配置。

分词器测试

可以通过_analyzerAPI来测试分词的效果。

POST _analyze
{"analyzer": "standard","text": "The quick brown fox"
}

响应结果如下:

{"tokens" : [{"token" : "the","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "quick","start_offset" : 4,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 1},{"token" : "brown","start_offset" : 10,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 2},{"token" : "fox","start_offset" : 16,"end_offset" : 19,"type" : "<ALPHANUM>","position" : 3}]
}

同时你也可以按照下面的规则组合使用:

  • 0个或者多个character filters
  • 一个tokenizer
  • 0个或者多个token filters
POST _analyze
{"tokenizer": "standard","filter": ["lowercase"],"text": "The quick brown fox"
}

响应结果如下:

{"tokens" : [{"token" : "the","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "quick","start_offset" : 4,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 1},{"token" : "brown","start_offset" : 10,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 2},{"token" : "fox","start_offset" : 16,"end_offset" : 19,"type" : "<ALPHANUM>","position" : 3}]
}

与之前不同的是,它会将切分的词进行小写处理。这是因为我添加了一个lowercasetoken filter,它会将分词的词进行小写处理。

我们还可以在创建索引前设置一个自定义的分词器:

PUT /my_index?pretty
{"settings": {"analysis": {"analyzer": {"std_folded": { "type": "custom","tokenizer": "standard","filter": ["lowercase","asciifolding"]}}}},"mappings": {"properties": {"my_text": {"type": "text","analyzer": "std_folded" }}}
}GET /my_index/_analyze?pretty
{"analyzer": "std_folded", "text":     "Is this déjà vu?"
}GET /my_index/_analyze?pretty
{"field": "my_text", "text":  "Is this déjà vu?"
}

上面操作我们自定义了一个分词器std_folded,它的tokenizerstandard,同时有两个token filter分别为:lowercaseasiciifolding。我们在定义mapping时,设置了一个字段名为my_text,它的类型为text,我们指定它使用的分词器为我们定义的std_folded.在分词测试中,我们获取的结果为:

{"tokens" : [{"token" : "is","start_offset" : 0,"end_offset" : 2,"type" : "<ALPHANUM>","position" : 0},{"token" : "this","start_offset" : 3,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "deja","start_offset" : 8,"end_offset" : 12,"type" : "<ALPHANUM>","position" : 2},{"token" : "vu","start_offset" : 13,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 3}]
}

配置内置分词器

内置的分词器无需任何配置我们就可以使用。但是我们可以修改内置的部分选项修改它的行为。

DELETE my_indexPUT /my_index?pretty
{"settings": {"analysis": {"analyzer": {"std_english": { "type":      "standard","stopwords": "_english_"}}}},"mappings": {"properties": {"my_text": {"type":     "text","analyzer": "standard", "fields": {"english": {"type":     "text","analyzer": "std_english" }}}}}
}POST /my_index/_analyze?pretty
{"field": "my_text", "text": "The old brown cow"
}POST /my_index/_analyze?pretty
{"field": "my_text.english", "text": "The old brown cow"
}

上面的例子中,我们配置分词器std_english,它使用的分词器为standard分词器,他的停词列表设置为_english_.然后字段my_text使用的是standard分词器,而字段my_text.english使用的是我们配置的std_english.最后的分词测试结果如下:

{"tokens" : [{"token" : "the","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "old","start_offset" : 4,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "brown","start_offset" : 8,"end_offset" : 13,"type" : "<ALPHANUM>","position" : 2},{"token" : "cow","start_offset" : 14,"end_offset" : 17,"type" : "<ALPHANUM>","position" : 3}]
}
{"tokens" : [{"token" : "old","start_offset" : 4,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "brown","start_offset" : 8,"end_offset" : 13,"type" : "<ALPHANUM>","position" : 2},{"token" : "cow","start_offset" : 14,"end_offset" : 17,"type" : "<ALPHANUM>","position" : 3}]
}

结果1和2的区别为,结果2中的停词The被删除,而结果1中的并没有。这是因为my_text.english配置了停词。

创建自定义分词器

当内置的分词器无法满足需求时,可以创建custom类型的分词器。

  • tokenizer:内置或定制的tokenizer.(必须)
  • char_filter:内置或定制的char_filter(非必须)
  • filter:内置或定制的token filter(非必须)
  • position_increment_gap:当值为文本数组时,设置改值会在文本的中间插入假空隙。设置该属性,对与后面的查询会有影响。默认该值为100.
PUT my_index
{"settings": {"analysis": {"analyzer": {"my_custom_analyzer":{"type":"custom","tokenizer":"standard","char_filter":["html_strip"],"filter":["lowercase","asciifolding"]}}}}
}

上面的示例中定义了一个名为my_custom_analyzer的分词器,该分词器的typecustomtokenizerstandardchar_filterhmtl_strip,filter定义了两个分别为:lowercaseasciifolding。运行分词测试:

POST my_index/_analyze
{"text": "Is this <b>déjà vu</b>?","analyzer": "my_custom_analyzer"
}

结果如下:

{"tokens" : [{"token" : "is","start_offset" : 0,"end_offset" : 2,"type" : "<ALPHANUM>","position" : 0},{"token" : "this","start_offset" : 3,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "deja","start_offset" : 11,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 2},{"token" : "vu","start_offset" : 16,"end_offset" : 22,"type" : "<ALPHANUM>","position" : 3}]
}

指定分词器

分词器的使用地方有两个:

  • 创建索引时
  • 进行搜索时

创建索引时指定分词器

如果设置手动设置了分词器,ES将按照下面顺序来确定使用哪个分词器:

  • 先判断字段是否有设置分词器,如果有,则使用字段属性上的分词器设置
  • 如果设置了analysis.analyzer.default,则使用该设置的分词器
  • 如果上面两个都未设置,则使用默认的standard分词器

为字段指定分词器

PUT my_index
{"mappings": {"properties": {"title":{"type":"text","analyzer": "whitespace"}}}
}

设置索引默认分词器

PUT my_index
{"settings": {"analysis": {"analyzer": {"default":{"type":"simple"}}}}
}

搜索时如何确定分词器

在搜索时,通过下面参数依次检查搜索时使用的分词器:

  • 搜索时指定analyzer参数
  • 创建mapping时指定字段的search_analyzer属性
  • 创建索引时指定settinganalysis.analyzer.default_search
  • 查看创建索引时字段指定的analyzer属性

如果上面几种都未设置,则使用默认的standard分词器。

搜索时指定analyzer查询参数

GET my_index/_search
{"query": {"match": {"message": {"query": "Quick foxes","analyzer": "stop"}}}
}

指定字段的seach_analyzer

PUT my_index
{"mappings": {"properties": {"title":{"type":"text","analyzer": "whitespace","search_analyzer": "simple"}}}
}

指定索引的默认搜索分词器

PUT my_index
{"settings": {"analysis": {"analyzer": {"default":{"type":"simple"},"default_seach":{"type":"whitespace"}}}}
}

上面指定创建索引时使用的默认分词器为simple分词器,而搜索的默认分词器为whitespace分词器。

转自 一个菜鸟:https://www.jianshu.com/p/bebea42b5040

参考:https://www.cnblogs.com/cjsblog/p/10171695.html

ES-分词器(Analyzer)相关推荐

  1. ELK下es的分词器analyzer

    转载链接 :es的分词器analyzerhttps://www.cnblogs.com/xiaobaozi-95/p/9328948.html 中文分词器 在lunix下执行下列命令,可以看到本来应该 ...

  2. es分词器错误分析_了解ElasticSearch分析器

    es分词器错误分析 令人遗憾的是,许多早期的互联网啤酒配方不一定是易于消化的格式. 也就是说,这些食谱是通常由电子邮件或论坛帖子最初组成的非结构化混合的说明和成分列表. 因此,虽然很难轻松地将这些配方 ...

  3. ElasticSearch入门:ES分词器与自定义分词器

    ES入门:ES分词器与自定义分词器 分词器的简单介绍 不同分词器的效果对比 自定义分词器的应用 分词器的简单介绍 分词器是es中的一个组件,通俗意义上理解,就是将一段文本按照一定的逻辑,分析成多个词语 ...

  4. 【ES实战】ES分词器介绍

    文章目录 ES分词器介绍 什么是分词器 分词器的组成 Character filters Tokenizers Token filters 分词的过程 写入时分词 搜索时分词 测试分词效果 分词器的分 ...

  5. Lucene.net(4.8.0)+PanGu分词器 问题记录一 分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  6. ElasticSearch 自定义分词器Analyzer示例

    一.前提概述 接下来定义一个index,并在该index中使用自定义分词器. 假设在ES中有这么一个index,用来存储用户在什么时间调用了哪个接口,调用的入参是什么的这么一个信息(即服务网关日志), ...

  7. 学习 ES 的笔记、全文检索、倒排索引、Lucene、ik中文分词器、Kibana使用Dev Tools

    文章目录 感悟 新接触的单词 知识点一:ES是什么? 知识点二:ES基本概念 知识点三:1.1 什么是全文检索和Lucene? 知识点四:1.2 什么是倒排索引,Lucene实现全文检索的流程是怎样? ...

  8. Elasticsearch之Analyzer分词器介绍

    Elasticsearch之Analyzer分词器介绍 Analysis Analyzer的组成 ES中内置的分词器 Analyzer的使用 几种分词器介绍 Standard Analyzer Sim ...

  9. es自定义分词器和分词规则

    1.analysis 和 analyzer analysis是指把全文本转换成一系列单词(term/token)的过程,也叫分词. analysis是通过分词器analyzer来实现的 2.分词 St ...

  10. IK Analyzer 中文分词器

    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本.最初,它是以开源项目Luence为应用 ...

最新文章

  1. 你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
  2. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法
  3. Ubuntu中php.ini修改运行内存
  4. jquery创建并行对象或者叫合并对象
  5. 538. 把二叉搜索树转换为累加树
  6. 前端学习(1355) 子模板
  7. Linux系统通过FTP进行文档基本操作【华为云分享】
  8. SpringBoot-WebMvcAutoConfiguration/WebMvcConfigurer/WebMvcRegistrationsAdapter
  9. 实训汇编语言设计——16位数拆分为4组
  10. 联想 M7400 两种清零方法
  11. Lisa新歌破吉尼斯世界纪录,MV播放量7460万,中国粉丝贡献大
  12. 消遣时间的小程序有哪些?这3个好玩又有趣的游戏小程序送给你!
  13. 教学相长——什么是真正的学习型人才
  14. 为了证明苹果电脑会不会中毒,我把病毒拷了进去
  15. 2021年中国药店行业发展概述及未来发展趋势分析[图]
  16. 为了一窥究竟,我抓取了全校学生的毕设信息
  17. 全球与中国1,6-己二硫醇市场深度研究分析报告
  18. 【软件测试】敏捷方法与测试左移
  19. ureport 报表合并单元格后双斜表头制作
  20. 依赖注入是什么意思?获取依赖的方式是什么?

热门文章

  1. 设计模型概念了解-------------【设计模型】
  2. Android动画合集
  3. html5点赞仿抖音,仿抖音之——点赞动画
  4. Nibabel 读取 nii 文件和 nii.gz 文件
  5. Java唐诗学习系统
  6. 迈瑞BC5800出图
  7. 星星之火-39: 什么是LTE物理层“时频”资源以及与物理层信道帧结构、物理层信道的关系?
  8. oppo锁频段_OPPO手机这样设置,让你的网络更加稳定!
  9. iOS 12.4 越狱工具 unc0ver 详细教程;Android 手机无痛互传;Apple 更改应用评级
  10. 基于C++的Huffman赫夫曼编译码器开发 课程论文+项目源码及可执行exe文件