基于ElasticSearch Analyzer的使用规则详解

 更新时间:2021年07月12日 10:23:17   作者:wanson2015  
这篇文章主要介绍了基于ElasticSearch Analyzer的使用规则,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

analyzer的使用规则

查询只能查找倒排索引表中真实存在的项, 所以保证文档在索引时与查询字符串在搜索时应用相同的分析过程非常重要,这样查询的项才能够匹配倒排索引中的项。

尽管是在说 文档 ,不过分析器可以由每个字段决定。 每个字段都可以有不同的分析器,既可以通过配置为字段指定分析器,也可以使用更高层的类型(type)、索引(index)或节点(node)的默认配置。在索引时,一个字段值是根据配置或默认分析器分析的。

例如为 my_index 新增一个字段:

PUT /my_index/_mapping/my_type
{
    "my_type": {
        "properties": {
            "english_title": {
                "type":     "string",
                "analyzer": "english"
            }
        }
    }
}

现在我们就可以通过使用 analyze API 来分析单词 Foxes ,进而比较 english_title 字段和 title 字段在索引时的分析结果:

GET /my_index/_analyze
{
"field": "my_type.title",
"text": "Foxes"
}
 
GET /my_index/_analyze
{
"field": "my_type.english_title",
"text": "Foxes"
}
  1. 字段 title ,使用默认的 standard 标准分析器,返回词项 foxes 。
  2. 字段 english_title ,使用 english 英语分析器,返回词项 fox 。

这意味着,如果使用底层 term 查询精确项 fox 时, english_title 字段会匹配但 title 字段不会。

如同 match 查询这样的高层查询知道字段映射的关系,能为每个被查询的字段应用正确的分析器。 可以使用 validate-query API 查看这个行为:

GET /my_index/my_type/_validate/query?explain
{
    "query": {
        "bool": {
            "should": [
                { "match": { "title":         "Foxes"}},
                { "match": { "english_title": "Foxes"}}
            ]
        }
    }
}

返回语句的 explanation 结果:

(title:foxes english_title:fox)

match 查询为每个字段使用合适的分析器,以保证它在寻找每个项时都为该字段使用正确的格式。

默认分析器

虽然我们可以在字段层级指定分析器, 但是如果该层级没有指定任何的分析器,那么我们如何能确定这个字段使用的是哪个分析器呢?

分析器可以从三个层面进行定义:按字段(per-field)、按索引(per-index)或全局缺省(global default)。Elasticsearch 会按照以下顺序依次处理,直到它找到能够使用的分析器。索引时的顺序如下:

  • 字段映射里定义的 analyzer ,否则
  • 索引设置中名为 default 的分析器,默认为
  • standard 标准分析器

在搜索时,顺序有些许不同:

  • 查询自己定义的 analyzer ,否则
  • 字段映射里定义的 analyzer ,否则
  • 索引设置中名为 default 的分析器,默认为
  • standard 标准分析器

有时,在索引时和搜索时使用不同的分析器是合理的。 我们可能要想为同义词建索引(例如,所有 quick 出现的地方,同时也为 fast 、 rapid 和 speedy 创建索引)。但在搜索时,我们不需要搜索所有的同义词,取而代之的是寻找用户输入的单词是否是 quick 、 fast 、 rapid 或 speedy 。

为了区分,Elasticsearch 也支持一个可选的 search_analyzer 映射,它仅会应用于搜索时( analyzer 还用于索引时)。还有一个等价的 default_search 映射,用以指定索引层的默认配置。

如果考虑到这些额外参数,一个搜索时的 完整 顺序会是下面这样:

  • 查询自己定义的 analyzer ,否则
  • 字段映射里定义的 search_analyzer ,否则
  • 字段映射里定义的 analyzer ,否则
  • 索引设置中名为 default_search 的分析器,默认为
  • 索引设置中名为 default 的分析器,默认为
  • standard 标准分析器

Elasticsearch分词(Analyzer)

一、什么是Analysis ?

Analysis 叫做分词,就是将文本转换为一系列单词(term/token)的过程。

Analysis 是通过Analyzer来实现的。

可使用Elasticserach内置的分析器或按需优化分需求或安装分析器插件 。

在数据写入的时候转换词条于Query语句查询的时候也需要用相同的分析器。

二、Analyzer的组成与工作机制

Character Filter 针对原始文本处理,例如去除html。

Tokenizer 按规则切分为单词。Tokenizer Filter将切分的单词进行加工,小写,删除stopwords,增加同义词。

在这里插入图片描述

三、Elasticserach内置的一些分词器

1) _analyzer API 三种使用方法

2) Standard Analyzer

原理

在这里插入图片描述

示例

在这里插入图片描述

3)Simple Analyzer

原理

在这里插入图片描述

示例

在这里插入图片描述

4)Whitespace Analyzer

原理

在这里插入图片描述

示例

在这里插入图片描述

5)Stop Analyzer

原理

在这里插入图片描述

示例

在这里插入图片描述

6)Keyword Analyzer

原理

在这里插入图片描述

示例

在这里插入图片描述

7)Pattern Analyzer

原理

在这里插入图片描述

示例

在这里插入图片描述

8)Language Analyzer

支持按语言分词

示例

在这里插入图片描述

四、中文分词

中文分词的难点:

中文句子,切成一个一个词(不是一个一个字)。英文中,单词有自然的空格作为分隔。一句中文,在不同的上下文,有不同的理解。

1)ICU Analyzer

原理

在这里插入图片描述

演示(需要提前安装 ICU Analyze 插件)

在这里插入图片描述

2)IK

在这里插入图片描述

3) THULAC

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Web制作登录验证码实现代码解析

    Java Web制作登录验证码实现代码解析

    这篇文章主要介绍了Java Web制作登录验证码实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • springboot集成tkmapper及基本使用教程

    springboot集成tkmapper及基本使用教程

    tk.mybatis可以节省程序员的大部分时间,对于程序员来说关于一张表的操作无非就是增删改查,tk.mybatis提供了一些基本操作的SQL语句,比如说按表的主键查询、删除等基本操作,我们接下来就来介绍一些springboot集成tkmapper及基本使用
    2022-11-11
  • 详解SpringMVC学习系列(6) 之 数据验证

    详解SpringMVC学习系列(6) 之 数据验证

    这篇文章主要介绍了详解SpringMVC学习系列(6) 之 数据验证 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • 使用JPA主键@Id,@IdClass,@Embeddable,@EmbeddedId问题

    使用JPA主键@Id,@IdClass,@Embeddable,@EmbeddedId问题

    这篇文章主要介绍了使用JPA主键@Id,@IdClass,@Embeddable,@EmbeddedId问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 如何使用Java在excel单元格中设置超链接

    如何使用Java在excel单元格中设置超链接

    这篇文章主要介绍了如何使用Java在excel单元格中设置超链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java 服务端消息推送的实现小结

    Java 服务端消息推送的实现小结

    本文主要介绍了Java 服务端消息推送的实现小结,主要包括四种常见的消息实时推送方案:短轮询、长轮询、SSE 和 WebSocket,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • java实现二分法的完整代码

    java实现二分法的完整代码

    这篇文章主要为大家详细介绍了java实现二分法的完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 解决Swagger2返回map复杂结构不能解析的问题

    解决Swagger2返回map复杂结构不能解析的问题

    这篇文章主要介绍了解决Swagger2返回map复杂结构不能解析的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 使用sts工具、SpringBoot整合mybatis的详细步骤

    使用sts工具、SpringBoot整合mybatis的详细步骤

    这篇文章主要介绍了使用sts工具、SpringBoot整合mybatis的详细步骤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring中属性注入的几种方式以及复杂属性的注入详解

    Spring中属性注入的几种方式以及复杂属性的注入详解

    这篇文章主要介绍了Spring中属性注入的几种方式以及复杂属性的注入详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论