Elasticsearch 分词器切词器分析器

news2024/9/28 7:21:08

normalization : 文档规范化

先切词,然后规范化.

规范化要规范哪些内容?

大小写; 标点符号; 时态; 复数;

规范化主要是为了匹配更精准

character filter : 字符过滤器. 标点符号

分词之前的预处理,过滤无用字符

  • HTML Strip Character Filter

    :html_strip

    • 参数:escaped_tags 需要保留的html标签
  • Mapping Character Filter:type mapping

  • Pattern Replace Character Filter:type pattern_replace



> normalization 通过分词器把单词分词然后规范化  查看具体分词器效果
​```json
GET _analyze
{
  "text": "the computer Apple is the best Tools, Teacher's notebood",
  "analyzer": "english"
}
GET _analyze
{
  "text": "the computer Apple is the best Tools",
  "analyzer": "standard"
}
​```

- HTML strip 过滤html标签
- mapping 映射替换的标点符号等
- pattern Replace 正则替换
- 分词器在创建时指定
DELETE test_idx_analyzer1
PUT test_idx_analyzer1
{
  "settings": {
    // 这里是分析器 不是分词器; 分词器可以包含设置过滤器和分词器
    "analysis": {
      // 这个有四种类型具体看官方文档
      "char_filter": {
        // 分词器名称
        "test_char_filter1": {
          // 指定具体的类型, 具体类型看官方文档, 
          "type": ["html_strip"],
          "escaped_tags": ["a"]
        }
      },
      "analyzer": {
        "test_analyzer1": {
          "tokenizer": "keyword",
          "char_filter": "test_char_filter1"
        }
      }
    }
  }
}```html
<p> I&apos;m so <a>Happy</a></p>
​```
GET test_idx_analyzer1/_analyze
{
  "analyzer": "test_analyzer1"
  , "text": "<p> I&apos;m so <a>Happy</a></p>"
}

### mapping
DELETE test_idx_analyzer3
PUT test_idx_analyzer3
{
  "settings": {
    // 这里是分析器 不是分词器; 分词器可以包含设置过滤器和分词器
    "analysis": {
      // 这个有四种类型具体看官方文档
      "char_filter": {
        "test_mapping_filter1": {
          "type": "mapping",
          "mappings":[
            "滚 => *",
            "蛋 => x"
            ]
        }
      },
      "analyzer": {
        "test_analyzer2": {
          "tokenizer": "keyword",
          "char_filter": ["test_mapping_filter1"]
        }
      }
    }
  }
}
GET test_idx_analyzer3/_analyze
{
  "analyzer": "test_analyzer2"
  , "text": "滚蛋球"
}

### Pattern replace


### pattern replace
DELETE test_idx_analyzer3
PUT test_idx_analyzer3
{
  "settings": {
    // 这里是分析器 不是分词器; 分词器可以包含设置过滤器和分词器
    "analysis": {
      // 这个有四种类型具体看官方文档
      "char_filter": {
        "test_mapping_filter1": {
          "type": "pattern_replace",
          "pattern": "(\\d{3})(\\d{4})(\\d{4})",
          "replacement": "$1***$2"
        }
      },
      "analyzer": {
        "test_analyzer2": {
          "tokenizer": "keyword",
          "char_filter": ["test_mapping_filter1"]
        }
      }
    }
  }
}
GET test_idx_analyzer3/_analyze
{
  "analyzer": "test_analyzer2"
  , "text": "12345677890"
}

tokenizer : 分词器

安装IK分词器

IK地址:

https://github.com/medcl/elasticsearch-analysis-ik/blob/master/README.md

分词器安装目录

es_home/plugins/ik

分词器安装方式

// 此例子可能需要安装插件, 插件安装有单独一节进行讲解见后
每个节点同义词文件都要同步吗?是的
// ik每个node都要安装; 如果版本不对有两种办法

  1. 手动编译安装
  2. 相近的版本可以直接修改版本

如何手动安装?

git clone https://github.com/medcl/elasticsearch-analysis-ik
cd elasticsearch-analysis-ik
git checkout tags/{version}
mvn clean
mvn compile
mvn package
拷贝和解压release下的文件: #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-*.zip 到你的 elasticsearch 插件目录, : plugins/ik 重启elasticsearch

相近的版本可以直接修改版本

vim plugin-descriptor.properties
修改
elasticsearch.version=your_version

> 如果修改plugin-descriptor.properties里的版本号不行的话,还有elasticsearch-analysis-ik-xxx.jar内pom.properties里的版本号。

常见分词器

  • standard analyzer:默认分词器,中文支持的不理想,会逐字拆分。
  • pattern tokenizer:以正则匹配分隔符,把文本拆分成若干词项。
  • simple pattern tokenizer:以正则匹配词项,速度比pattern tokenizer快。
  • whitespace analyzer:以空白符分隔 Tim_cookie

自定义分词器:custom analyzer

char_filter:内置或自定义字符过滤器 。

token filter:内置或自定义token filter 。

tokenizer:内置或自定义分词器。

中文分词器IK

IK分词器

安装和部署

  • ik下载地址:https://github.com/medcl/elasticsearch-analysis-ik
  • Github加速器:https://github.com/fhefh2015/Fast-GitHub
  • 创建插件文件夹 cd your-es-root/plugins/ && mkdir ik
  • 将插件解压缩到文件夹 your-es-root/plugins/ik
  • 重新启动es
  1. IK文件描述

    • IKAnalyzer.cfg.xml:IK分词配置文件
  • 主词库:main.dic
    • 英文停用词:stopword.dic,不会建立在倒排索引中
    • 特殊词库:
      • quantifier.dic:特殊词库:计量单位等
      • suffix.dic:特殊词库:行政单位
      • surname.dic:特殊词库:百家姓
      • preposition:特殊词库:语气词
    • 自定义词库:网络词汇、流行词、自造词等
  1. ik提供的两种analyzer:

    1. ik_max_word会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
    2. ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

扩展IK词库

修改IKAnalyzer.cfg.xml中自定义词库的路径,路径原则上可以随便放,管理是跟ik放一起,建一个custome目录

在这里插入图片描述

token filter : 令牌过滤器

停用词、时态转换、大小写转换、同义词转换、语气词处理等。比如:has=>have him=>he apples=>apple the/oh/a=>干掉

处理大小写


// why get not PUT
// I miss the keyword _analyze,why? cannot understand better?
// this way is operate exists index to do query
GET /test_index02/_analyze
{
  "tokenizer": "standard",
  "filter": {
    "type": "condition",
    "filter": "uppercase",
    "script": {
      "source": "token.getTerm().length() < 5"
    }
  },
  "text": ["abdsfs sdf dsfdsf dsf dsfdsf sd fds fds f dsf sd f dsf sd fs df sdf dsfdsfdsfs dfdsfds"]
}

token_filter同义词替换

  • 定义同义词词典文件 格式 src1,src2 => target

  • vim analysis/synonyms.txt
    Mengdiudiu,mengdiudiu => MDO
    
  • 同步到目录 es_home/config/analysis/your_dict.txt

  • 如何验证是否生效:

  • DELETE test_index01
    PUT /test_index01
    {
      "settings": {
        "index": {
          "analysis": {
            "analyzer": {
              "test_index01_synonym": {
                "tokenizer": "whitespace",
                "filter": [ "test_index01_synonym" ]
              }
            },
            "filter": {
              "test_index01_synonym": {
                "type": "synonym",
                "synonyms_path": "analysis/synonyms.txt"
              }
            }
          }
        }
      }
    }
    GET /test_index01/_analyze
    {
      "text": "Mengdiudiu",
      "analyzer": "test_index01_synonym"
    }
    

第二种方式

DELETE test_index02
PUT /test_index02
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "test_index02_search_synonyms": {
            "tokenizer": "whitespace",
            "filter": [ "test_index02_graph_synonyms" ]
          }
        },
        "filter": {
          "test_index02_graph_synonyms": {
            "type": "synonym_graph",
            "synonyms_path": "analysis/synonyms.txt"
          }
        }
      }
    }
  }
}
GET /test_index02/_analyze
{
  "text": "Mengdiudiu",
  "analyzer": "test_index02_search_synonyms"
}

自定义切词器,分析器

DELETE test_index03
PUT /test_index03
{
  "settings": {
    "analysis": {
      "char_filter": {
        // 自定义char_filter: 转换单词
        "test_myfilter03": {
          "type": "mapping",
          "mappings": ["& => and", "| => or"]
        }
        // 可以定义多个char_filter,其余的是否可以定义多个可以尝试
      },
      "filter": {
        // 自定义过滤器: 过滤停用词
        "test_mystop01":{
          "type": "stop",
          "stopwords": ["is", "the"]
        }
      },
      "tokenizer": {
        // 自定义切词器
        "test_mytokenizer01":{
          "type": "pattern",
          "pattern": "[.,!? ]"
        }
      },
      "analyzer": {
        // 自定义分析器
        "test_myanalyzer01": {
          // 分词器类型,自定义
          "type": "custom",
          "char_filter": ["test_myfilter03"],
          "tokenizer": "test_mytokenizer01",
          "filter": ["test_mystop01","lowercase"]
          
        }
      }
    }
  }
}
GET test_index03/_analyze
{
  // 使用自定义的analyzer
  "analyzer": "test_myanalyzer01",
  "text": "is,the.New? Apple! & |"
}

常用分词器

中文分词器

已定义分词器

词库热更新

如果每次更新词库都要重启服务这是生产环境无法忍受的.

所以现在支持热更新;

使用方式就是配置IK config文件的remote_ext_dict的url地址进行热更新(默认是location)

具体的热更新见IK github说明

https://github.com/medcl/elasticsearch-analysis-ik

热更新的坑

  • 你本地启动的服务只是告诉es要不要更新,并不是由这个服务返回最新内容,即最终reload操作还是es node从自己本地目录去加载
  • node 对应的停用词文件, 分词文件必须有,理由见第一条.
  • 停用词和分词文件目录一定要放对plugins/ik/config/custome, 一定要在ik的config内,它是相对这里的, 其他地方不生效,除非配置绝对路径
  • 正更新流程是这样的: 修改各个node本地文件-> 三方服务告诉es需要更新->es reload本地文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C3】内核模块,设备号,字符驱动,设备节点

文章目录 1.内核模块&#xff1a;必须包含module.h2.内核模块参数&#xff1a;权限位是用在sysfs文件系统里&#xff0c;只读权限用S_IRUGO设置2.1 extern&#xff1a;声明来自另一个模块 3.设备号&#xff1a;主设备号对应驱动程序&#xff0c;具有相同主设备号设备使用相同驱…

Android Studio Bot 下载使用

Android Studio Bot 下载使用 本文最新更新地址 https://gitee.com/chenjim/chenjimblog 下载 Android Studio Hedgehog 当前的新版本是 2023.1.1 Canary 10找到Studio Bot: View->Tool Windows->Studio Bot&#xff0c;或者下图 登录 Google 账号&#xff0c;注意当前限…

Echarts拼接折线图,左右两部分设置不同的样式及formatter的处理

option {tooltip: {trigger: axis,formatter: (params) > {console.log(params);if (params && params.length 2) {if (params[0].value ! -) {return 日期&#xff1a;${params[0].name}<br>${params[0].marker} ${params[0].value};} else {return 日期&a…

Spring Boot 中的分布式配置中心

Spring Boot 中的分布式配置中心 Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;分布式配置中心是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们管理应用程序中的配置信息…

Android---SQLite优化

SQLite 是一款轻型的数据库&#xff0c;是遵循 ACID 关系型数据库管理系统&#xff0c;它包含在一个相对小的 C 库中。它是 D.RichardHipp 建立的公有领域项目。它的设计目的是嵌入式的&#xff0c;而且目前已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&…

日期时间~

1&#xff1a;Data类的概述 Data类的对象在Java中代表的是当前所在系统的此刻日期时间 2&#xff1a;Data的构造器 3&#xff1a;常用方法 2:SimpleDateFormat 可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式。也可以把字符串的时间形式解析成日期对象 1&#xff1…

计算机网络编程 | 多路I/O转接服务器

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

大模型在银行业客服中心的应用

随着金融科技领域的不断发展&#xff0c;金融机构改变了传统方式&#xff0c;将更多服务从线下转移到线上&#xff0c;为了提升客户体验和效率&#xff0c;金融机构不断探索自然语言处理、机器学习等技术手段来优化客服服务&#xff0c;其中大模型技术被广泛应用&#xff0c;成…

python sorted函数多条件排序大量数据时出现错误排序

""" 求生日&#xff0c;我的理解是有四个排序条件&#xff0c;分别是&#xff0c;年月日&#xff0c;输入顺序 """ n int(input())person_list [[x for x in input().split()] for x in range(n)] print(person_list) # 给输入先后加入顺序 …

NSString 输出百分比 % 无法显示

通过 NSString 拼接显示半分比 % 符号的时候会遇到拼接了 % 但 UI 未能显示; 解决办法 在需要添加 % 处通过 %% 的表达方式即可成功输出. [NSString stringWithFormat:"%.f%%", deviceLevel * 100]; 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

【TensorRT】基本介绍

TensorRT用于高效实现已经训练好的深度学习的模型的推理过程的SDK&#xff0c;能使DL模型有更快的推理速度和更高的吞吐量。官方提供Python和C两种接口&#xff0c;形式基本一致且相互对应。 1 ✨ TensorRT介绍 &#x1f35f;1.1 TensorRT的工作 分为两个时期&#xff08;构建…

flask socket版本问题

1、版本问题 问题解决 根据官方给定的兼容版本&#xff0c;从socket.io官网CDN下载最新的4.4.1版本js文件&#xff0c;https://cdn.socket.io/。 python-engineio使用版本。需要更新的javascript.socketio包&#xff0c;具体可对照官方文档Requirements部分末尾 https://flask-…

红帽宣布为RHEL 7延长4年生命周期

早前一段时间&#xff0c;红帽原本计划在2024年7月1日结束支持&#xff0c;但是Red Hat表示由于部分IT企业需要更长的时间部署和升级&#xff0c;宣布为Red Hat Enterprise Linux 7(RHEL 7)增加4年的扩展生命支持(ELS)。 据了解&#xff0c;RHEL 7于2014年发布&#xff0c;支持…

uniapp解决跨域问题

配置&#xff1a; "proxy": {"/api": {"target": "https://s2.lakala.com","changeOrigin": true,"pathRewrite": {"^/api": "/api"}}} 目标路径 https://s2.lakala.com/api/v3/labs/relat…

7.1.4 【Linux】与目录树的关系

每个文件&#xff08;不管是一般文件还是目录文件&#xff09;都会占用一个 inode &#xff0c; 且可依据文件内容的大小来分配多个 block 给该文件使用。道目录的内容在记录文件名&#xff0c; 一般文件才是实际记录数据内容的地方。 目录 当我们在 Linux 下的文件系统创建一…

STM32 创建工程(库函数)

1.新建CORE ,FWLIB,OBJ,SYSTEM,USER五个文件夹 2.新建工程选择软件包 3.OBJ文件用来存放编译中间文件 4.FWLIB官方固件库包 src 存放的是固件库的.c 文件&#xff0c;inc 存放的是对应的.h 文件 直接从模板中粘贴进即可 5.CORE 6.USER文件夹需要复制的6个文件 7. 加入上面加入…

爱玩粥的有福了,带图形界面的明日方舟皮肤的员工管理系统,数据结构期末实训满分。

&#x1f4af; 博客内容&#xff1a;复习数据结构 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CS…

JavaEE学习的第三部分(重点在第四个知识点,SSM框架整合)

一、拦截器 Spring MVC的拦截器(Interceptor) 类似于Java Servlet的过滤器&#xff08;Filter&#xff09;。前面学习Java Web学过一点过滤器。 拦截器的作用 是拦截用户的请求&#xff0c;并做相应的处理 。例如在JSP提交表单数据给Controller&#xff0c;先是提交给拦截器的…

计算机毕业论文内容参考|基于Python的高校二手网络交易平台的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于Python的高校二手网络交易平台的设计与实现 摘要 本文设计并实现了一种基于Python的高校…

3、boostrap图片视频上传展示

boostrap图片视频上传展示 1、展示效果2、html代码 1、展示效果 项目目录结构 2、html代码 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--<link rel"st…