博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Elasticsearch搜索引擎第六篇-分词器
阅读量:4163 次
发布时间:2019-05-26

本文共 5964 字,大约阅读时间需要 19 分钟。

文章目录

官网:

认识分词器

在ES中一个Analyzer 由下面三种组件组合而成:

  • character filter:字符过滤器,对文本进行字符过滤处理,如处理文本中的html标签字符。处理完后再交给tokenizer进行分词。一个analyzer中可包含0个或多个字符过滤器,多个按配置顺序依次进行处理。
  • tokenizer:分词器,对文本进行分词。一个analyzer必需且只可包含一个tokenizer。
  • token filter:词项过滤器,对tokenizer分出的词进行过滤处理。如转小写、停用词处理、同义词处理。一个analyzer可包含0个或多个词项过滤器,按配置顺序进行过滤。

测试分词器

  • 示例一
    POST _analyze{
    "analyzer": "whitespace", "text": "The quick brown fox."}
    返回结果如下:
    {
    "tokens": [ {
    "token": "The", "start_offset": 0, "end_offset": 3, "type": "word", "position": 0 }, {
    "token": "quick", "start_offset": 4, "end_offset": 9, "type": "word", "position": 1 }, {
    "token": "brown", "start_offset": 10, "end_offset": 15, "type": "word", "position": 2 }, {
    "token": "fox.", "start_offset": 16, "end_offset": 20, "type": "word", "position": 3 } ]}
  • 示例二
    POST _analyze{
    "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ], "text": "Is this deja vu?"}
    返回结果:
    {
    "tokens": [ {
    "token": "is", "start_offset": 0, "end_offset": 2, "type": "
    ", "position": 0 }, {
    "token": "this", "start_offset": 3, "end_offset": 7, "type": "
    ", "position": 1 }, {
    "token": "deja", "start_offset": 8, "end_offset": 12, "type": "
    ", "position": 2 }, {
    "token": "vu", "start_offset": 13, "end_offset": 15, "type": "
    ", "position": 3 } ]}

Character Filter 字符过滤器

官网:

当一段内容提交时,字符过滤器会按照规则过滤一些特殊字符,ES提供了几种常用的字符过滤器,如下:

  • HTML Strip Character Filter

    用来过滤html标签

    测试:

    POST _analyze{
    "tokenizer": "keyword", "char_filter": [ "html_strip" ], "text": "

    I'm so happy!

    "}

    返回结果:

    I'm so happy!

    在索引中配置如下:

    PUT my_index{
    "settings": {
    "analysis": {
    "analyzer": {
    "my_analyzer": {
    "tokenizer": "keyword", "char_filter": ["my_char_filter"] } }, "char_filter": {
    "my_char_filter": {
    "type": "html_strip", "escaped_tags": ["b"] } } } }}
    • char_filter中定义自己的字符过滤器
    • escaped_tags用来指定例外的标签。如果没有例外标签需配置,则不需要在此进行定义
    • analyzer中定义自己的分析器,分析器有一系列的分词器或过滤器构成,在这里引用了my_char_filter过滤器
  • Mapping Character Filter

    用指定的字符串替换文本中的某字符串

  • Pattern Replace Character Filter

    进行正则表达式替换

Tokenizer 分词器

官网地址:

ES内部提供了很多分词器,基本可以满足日常使用。

在这里插入图片描述
但是ES中没有提供中文分词器,集成中文分词器请跳转:

集成的中文分词器IKAnalyzer中提供的tokenizer名称为:ik_smart、ik_max_word

测试tokenizer:

POST _analyze{
"tokenizer": "standard", "text": "张三说的确实在理"}POST _analyze{
"tokenizer": "ik_smart", "text": "张三说的确实在理"}

Token Filter 词项过滤器

官网:

ES内部提供了很多Token分词过滤器,主要用于分词或查询过后,如何进行后续的处理和过滤,如转小写过滤器、停用词过滤器、同义词过滤器等等。

IKAnalyzer中文分词器中自带有停用词过滤功能。

同义词过滤器

这里举个例子说明同义词过滤器如何工作的。

定义一个带有同义词过滤器功能的索引:

PUT /test_index{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"my_ik_synonym" : {
"tokenizer" : "ik_smart", "filter" : ["synonym"] } }, "filter" : {
"synonym" : {
"type" : "synonym", "synonyms_path" : "analysis/synonym.txt" } } } } }}

在analysis/synonym.txt文件中定义同义词:

张三,李四电饭煲,电饭锅 => 电饭煲电脑 => 计算机,computer
  • 文件一定要UTF-8编码
  • 一行一类同义词,=>表示标准化为后面的词

紧接着测试如下:

POST test_index/_analyze{
"analyzer": "my_ik_synonym", "text": "张三说的确实在理"}POST test_index/_analyze{
"analyzer": "my_ik_synonym", "text": "我想买个电饭锅和一个电脑"}

Analyzer 分析器

官网:

Analyzer是字符过滤器、分词器、词项过滤器的集合,ES内建的和集成的analyzer都可以直接使用,如果不能满足我们的需求,则我们可以自己组合字符过滤器、分词器、词项过滤器来定义自定义的analyzer。

ES内部提供的analyzer:

在这里插入图片描述
自定义analyzer需要遵守以下规则:

  • 字符过滤器:0或多个
  • 分词器:必须有且只有一个
  • 词项过滤器:0或多个

为索引指定分析器

PUT my_index8{
"settings": {
"analysis": {
"analyzer": {
"my_ik_analyzer": {
"type": "custom", "tokenizer": "ik_smart", "char_filter": [ "html_strip" ], "filter": [ "synonym" ] } }, "filter": {
"synonym": {
"type": "synonym", "synonyms_path": "analysis/synonym.txt" } } } }}
  • tokenizer:指定分词器
  • char_filter:指定字符过滤器
  • filter:指定词项过滤器

为索引指定默认分词器

PUT /my_index10{
"settings": {
"analysis": {
"analyzer": {
"default": {
"tokenizer": "ik_smart", "filter": [ "synonym" ] } }, "filter": {
"synonym": {
"type": "synonym", "synonyms_path": "analysis/synonym.txt" } } } }, "mappings": {
"_doc": {
"properties": {
"title": {
"type": "text" } } } }}

测试一下:

PUT my_index10/_doc/1{
"title": "张三说的确实在理"}GET /my_index10/_search{
"query": {
"term": {
"title": "张三" } }}

为字段指定分析器

很多时候,希望指定字段使用不同的分析器,而不是这个索引,因此可以按照如下定义:

PUT my_index8/_mapping/_doc{
"properties": {
"title": {
"type": "text", "analyzer": "my_ik_analyzer" } }}

如果指定该字段在查询的时候使用不同的分析器,则可以这样定义:

PUT my_index8/_mapping/_doc{
"properties": {
"title": {
"type": "text", "analyzer": "my_ik_analyzer", "search_analyzer": "other_analyzer" } }}

测试:

PUT my_index8/_doc/1{
"title": "张三说的确实在理"}GET /my_index8/_search{
"query": {
"term": {
"title": "张三" } }}

Analyzer使用顺序

可以为每个查询、每个字段、每个索引指定分词器。

  • 在索引阶段ES按照如下顺序选用分词:

    • 首先选用字段mapping定义中指定的analyzer
    • 字段定义中没有指定analyzer,则选用 index settings中定义的名字为default 的analyzer
    • 如index setting中没有定义default分词器,则使用 standard analyzer
  • 在查询阶段ES按照如下顺序需用分词

    • 在查询语句中指定的analyzer
    • 在字段mapping的search_analyzer中定义的analyzer
    • 在字段mapping中定义的analyzer
    • 在index settings中名为default_search的analyzer
    • 在index settings中名为default的analyzer
    • standard analyzer

转载地址:http://hgsxi.baihongyu.com/

你可能感兴趣的文章
定时任务定时备份docker中mysql并将数据自动保存到另外一台服务器
查看>>
Java图形可视化工具graphviz-java
查看>>
docker中镜像的备份与迁移详细过程
查看>>
springboot2.0整合redis缓存注解
查看>>
spring中条件注解的使用 @Conditional
查看>>
Java基于JDK实现动态代理
查看>>
spring中Aware 接口 感知捕获
查看>>
maven打包spring项目缩小体积
查看>>
idea中的超实用小技巧提升编码效率
查看>>
在pom文件中指定 maven 引用下载好的jar包
查看>>
Git 提交代码指令实战使用
查看>>
SpringCloud-Gateway之RoutePredicateFactory
查看>>
设计模式-深入浅出
查看>>
设计模式-深入浅出之单例模式
查看>>
设计模式深入浅出(结构图方式讲解)
查看>>
docker中安装指定版本Redis
查看>>
springcloud 和 springalibabaCloud组件详细解析
查看>>
Redis缓存相关详解
查看>>
Redis缓存知识以及常用架构模式详细
查看>>
生成唯一订单号单机模式和分布式
查看>>