Elasticsearch自定义分析器
关于分析器
ES中默认使用的是标准分析器(standard analyzer)。如果需要对某个字段使用其他分析器,可以在映射中该字段下说明。例如:
PUT /my_index
{
"mappings": {
"blog": {
"properties": {
"title": {
"type": "string",
"fields": {
"english": {
"type": "string",
"analyzer": "english"
}
}
}
}
}
}
}
在上面:
主 title 字段使用 `standard`(标准)分析器。
title.english 子字段使用 `english`(英语)分析器。
关于自定义分析器
自定义分析器基于标准分析器(或其他ES已有的分析器),通过搭配字符过滤器、分词器和词单元过滤器,添加特定的配置,达到提高查询效果的作用。
1 字符过滤器
很多时候,我们需要处理的文本会是除了干净文本之外的任何文本。例如HTML文本直接进行分词会得到糟糕的效果。因此在分词之前整理文本会提升输出结果的质量。
HTML分词
业务不涉及,略
整理标点符号
可能也不需要。
2 分词器
standard 分词器使用 Unicode 文本分割算法。它是大多数语言分词的一个合理的起点,特别是西方语言。
3 词汇单元过滤器
值得注意的是,当使用多个过滤器,过滤器的先后顺序是有考究的。每一个语汇单元过滤器都可以处理来自上一个语汇单元过滤器输出的单词流。
3.1 归一化词元可以用的过滤器
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"folding": {
"tokenizer": "standard",
"filter": [ "lowercase", "asciifolding" ]
}
}
}
}
}
上面代码中为自定义分析器folding配置了两个过滤器lowercase过滤器和asciifolding过滤器。它们的具体功能,以及其他归一化词元过滤器将在下面一一介绍。
类似的,若需要配置其他过滤器,只需要在filter字段的列表中添加其他过滤器的名称。
lowercase过滤器
将接收的词元归一化为小写。
acciifolding过滤器
它不仅仅能去掉变音符号。如果文本是纯英语,不包含法语、德语啥的,也可以不考虑这个过滤器
3.2 词干提取器
3.2.1 基于算法的英文词干提取器
提供了一系列规则用于将一个词提取为它的词根形式,例如剥离复数词末尾的 s 或 es 。提取单词词干时并不需要知道该词的任何信息。
词干弱提取 就是无法将同样意思的单词缩减为同一个词根。例如, jumped 和 jumps 可能被提取为 jump , 但是 jumping 可能被提取为 jumpi 。弱词干提取会导致搜索时无法返回相关文档。
词干过度提取 就是无法将不同含义的单词分开。例如, general 和 generate 可能都被提取为 gener 。 词干过度提取会降低精准度:不相干的文档会在不需要他们返回的时候返回。
DEMO:
# English分析器配置文件,配置文件展示如下:
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"english_keywords": {
"type": "keyword_marker",
"keywords": []
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
}
},
"analyzer": {
"english": {
"tokenizer": "standard",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_keywords",
"english_stemmer"
]
}
}
}
}
} # keyword_marker 分词过滤器列出那些不用被词干提取的单词。这个过滤器默认情况下是一个空的列表。
# english 分析器使用了两个词干提取器: possessive_english 词干提取器和 english 词干提取器。
# 所有格词干提取器会在任何词传递到 english_stop 、 english_keywords 和 english_stemmer 之前去除 's 。
常见的基于算法的词干提取器
3.2.2 基于字典的英文词干提取器
只是简单地在字典里查找词。理论上可以给出比算法化词干提取器更好的结果,但,实践中一个好的算法词干提取器一般优于一个字典词干提取器。
3.3 停用词过滤器
停用词是什么
停用词是可以将日常使用频率较高而没有辨识度的词,例如:I, and, it等等。
过滤掉停用词的好处
过滤掉停用词的最主要好处是提高性能。如果我们不过滤掉停用词,当我们的检索词中包括停用词"the",如:“the oil field”,由于几乎所有文档都会包含“the”这个词,ES会为几乎所有文章进行评分,然后倒序排列,取Top N返回。相反,当我们使用停用词过滤器,“the”会被过滤,ES只会对匹配“oil”和“field”的文档进行评分、排序等。
如何在自定义分析器中启用停用词过滤器
标准分析器是不启用停用词过滤器的。我们可以自定义一个分析器my_analyzer,搭配使用标准分析器和停用词过滤器。
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "standard",
"stopwords": [ "and", "the" ]
}
}
}
}
}
上面“stopwords”属性的值是一个包含两个停用词(“and”和“the”)的停用词列表。这个列表也可以替换成“_某语言_”的形式,来指定使用该语言在ES中默认的停用词表。如:
"stopwords":"_english_"
我们也可以使用自定义停用词表。将自定义的停用词以一行一个单词的格式保存在文件中,此文件必须在集群的所有节点上,并且通过 stopwords_path 参数设置路径:
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_english": {
"type": "english",
"stopwords_path": "stopwords/english.txt" # 停用词文件的路径,该路径相对于 Elasticsearch 的 config 目录
}
}
}
}
}
Elasticsearch自定义分析器的更多相关文章
- ElasticSearch自定义分析器-集成结巴分词插件
关于结巴分词 ElasticSearch 插件: https://github.com/huaban/elasticsearch-analysis-jieba 该插件由huaban开发.支持Elast ...
- Elasticsearch 自定义多个分析器
分析器(Analyzer) Elasticsearch 无论是内置分析器还是自定义分析器,都由三部分组成:字符过滤器(Character Filters).分词器(Tokenizer).词元过滤器(T ...
- ES学习——分析器和自定义分析器
简介 es在对文档进行倒排索引的需要用分析器(Analyzer)对文档进行分析.建立索引.从文档中提取词元(Token)的算法称为分词器(Tokenizer),在分词前预处理的算法称为字符过滤器(Ch ...
- ElasticSearch:分析器
ElasticSearch入门 第七篇:分析器 这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch El ...
- elasticsearch 自定义_id
elasticsearch 自定义ID: curl -s -XPUT localhost:9200/web -d ' { "mappings": { "blog" ...
- Elasticsearch 自定义映射
尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域.自定义映射允许你执行下面的操作: 全文字符串域和精确值字符串域的区别 使用特定语言分析器 优化域以适应部分匹 ...
- elasticsearch 自定义similarity 插件开发
转自:http://www.chepoo.com/elasticsearch-similarity-custom-plug-in-development.html 在搜索开发中,我们要修改打分机制,就 ...
- elasticsearch自定义动态映射
https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-dynamic-mapping.html如果你想在运行时增加新的字 ...
- ElasticSearch——自定义模板
output中配置 elasticsearch{ action => "index" hosts => ["xxx"] index => &q ...
随机推荐
- 2017.11.15 JavaWeb的学生体质管理系统
(11)案例-----学生身体体质信息管理系统的开发 11.1 功能划分: 1.添加记录模块:完成向数据库添加新纪录 2.查询记录模块:完成将数据库的记录以网页的方式显示出来,一般采用有条件的查询 3 ...
- 2017.10.13 Java中引用类型变量的创建及使用&循环高级写法
今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 ...
- JavaEE 面试题总结
一. JDBC 4 1. Java中访问数据库的步骤 4 2. Statement,PreparedStatement,CallableStatement的功能.特点. 4 3. 如何利用JDBC的A ...
- SqlServer 连接GreenPlum问题处理
一.SQL SERVER.GREENPLUM 1. SSIS安装 ▶ 安装SQL SERVER 2005 数据库之后,运行SSIS工具,建立包,建立完成之后,新建工作流,双击工作流之后无法进行编辑,并 ...
- ES5 与 ES6六大不同
1.类Class 2.模块Module 导出变量 导出函数 导入 3.箭头函数 4.不再支持Mixins. 5.ES6不再支持自动绑定.
- java通过FreeMarker模板生成Excel文件之.ftl模板制作
关于怎么通过freemarker模板生成excel的文章很多,关键点在于怎么制作模板文件.ftl 网上的办法是: (1)把Excel模板的格式调好,另存为xml文件 (2)新建一个.ftl文件,把xm ...
- spring-bean(xml方式DI)
三种属性注入方式 构造函数注入 1.在Bean实体中写入构造函数(带参构造) 2. <bean id=”该bean的名称” class=”注入的bean的全路径”> <constru ...
- Linux文件服务器实战(匿名用户)
一.进程与线程 二.vsftp服务器 1.文件传输协议(file transfer protocol,FTP) 基于该协议ftp客户端和服务端实现文件共享,上传下载文件 FTP基于TCP协议生成一个虚 ...
- Swoole 创建服务
1: 创建TCP 服务器 $serv = new swoole_server(‘127.0.0.1’,9501); 2:创建UDP服务器 $serv = new swoole_server('127 ...
- OLAP和OLTP
OLTP与OLAP的介绍 数据处理分为两种技术架构系统:OLTP与OLAP OLTP(联机事务处理过程) OLTP是传统的关系型数据库的主要应用,主要是基本的,日常的事务处理,例如银行的交易 ...