8.1.2-elasticsearch文本解析之自定义分词器及分词器匹配规则

2023-11-12

创建自定义analyzer

在具体的业务场景当中可能内置的analyzer并不能满足需求,这就需要能够自定义analyzer,前文已经说过analyzer由3部分组成,自定义analyzer就是通过配置以下三部分内容来实现的:

序号 子构件 说明
1 character filter 0个或多个
2 tokenizer 有且只有一个
3 token filter 0个或多个

配置参数具体说明

序号 参数 对应子构件 说明
1 tokenizer tokenizer 接受内置的或自定义的tokenizer,有且一个
2 char_filter character filter 接受内置的或自定义的character filter,可选且为数组类型
3 filter token filter 接受内置的或自定义的token filter,可选且为数组类型
4 position_increment_gap 针对数组类型的字符串,es在每个字符串中间会插入一个虚拟的间隙以保证phrase查询得到的结果不跨越两个字符串,默认值为100

以下举例进行说明
(1)简单示例

序号 构件 实例
1 Character Filter html strip character filter
2 Tokenizer standard tokenizer
3 Token filter lowercase token filter,ascii_folding token filter
//定义char_filter、tokenizer、filter,均使用默认配置
PUT custom_analyzer_simple_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer":{
          "type":"custom",
          "tokenizer":"standard",
          "char_filter":["html_strip"],
          "filter":["lowercase","asciifolding"]
        }
      }
    }
  }
}


POST custom_analyzer_simple_index/_analyze
{
  "analyzer": "custom_analyzer",
  "text": [
    "<p>Transmission Control Protocol is a transport layer</p>"
  ]
}

以上示例将生成以下关键字

[transmission,control,protocol,is,a,transport,layer]

(2)复杂示例

序号 构件 实例
1 Character Filter mapping character filter,k-v结构的过滤器,将匹配的k以对应的v替代;
2 Tokenizer pattern tokenizer,模式匹配类型,以匹配处分割处理;
3 Token filter lowercase token filter,stopwords token filter
//自定义char_filter(自定义k-v结构)、tokenizer(模式匹配当中有空格)、filter
PUT custom_analyzer_complex_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "type": "custom",
          "char_filter": [
            "emoticons"
          ],
          "tokenizer": "punctuation",
          "filter": [
            "lowercase",
            "english_stop"
          ]
        }
      },
      "char_filter": {
        "emoticons": {
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      },
      "tokenizer": {
        "punctuation": {
          "type": "pattern",
          "pattern": "[ .,!?]"
        }
      },
      "filter": {
        "english_stop": {
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}
//1、请求参数
POST custom_analyzer_complex_index/_analyze
{
  "analyzer": "custom_analyzer",
  "text": "The good weather make me :)"
}

//2、返回结果:':)'转换成'_happy_'
{
  "tokens" : [
    {
      "token" : "good",
      "start_offset" : 4,
      "end_offset" : 8,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "weather",
      "start_offset" : 9,
      "end_offset" : 16,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "make",
      "start_offset" : 17,
      "end_offset" : 21,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "me",
      "start_offset" : 22,
      "end_offset" : 24,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "_happy_",
      "start_offset" : 25,
      "end_offset" : 27,
      "type" : "word",
      "position" : 5
    }
  ]
}

以上示例将生成以下关键字

[good,weather,make,me,_happy_]
指定analyzer的一点思考

es提供多种指定analyzer的方式,不过本质上都是针对text类型的字段进行处理,不管是text字段级别还是文档级别;
一般出于配置及使用简单性上的考虑,针对text类型字段统一采用相同的analyzer进行处理,较少针对每个text类型字段分别制定(除非特殊必要的场景);

I、在索引时多个级别均配置analyzer的情况下,es如何选择analyzer呢?

在这种情况下,es主要根据以下几个参数来顺序决定使用何种analyzer:
1)、查看字段上是否指定analyzer参数;
2)、查看索引上是否设置参数analysis.analyzer.default;
3)、若以上均未设置,则analyzer为standard;

1a)、字段级别指定analyzer

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

2a)、索引级别指定analyzer

PUT full_field_analyzer_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{
          "type":"simple"
        }
      }
    }
  }
}
II、在多个级别均配置查询analyzer的情况下,es如何选择索引的analyzer呢?

大多数情况下不需要针对字段或索引指定不同的analyzer,并且这种做法也不推荐(若一定要使用最好经过充足的测试);
1)、查看查询时字段上是否指定analyzer参数;
2)、查看字段上是否指定search_analyzer参数;
3)、查看索引上是否设置参数analysis.analyzer.default_search;
4)、查看字段上是否指定analyzer参数;
5)、若以上均未设置,则analyzer为standard;

1a)、查询时字段上指定analyzer

//1、新增文档
PUT part_field_analyzer_index/_doc/1
{
  "title":"The nice day"
}

//2、文档查询
GET part_field_analyzer_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "the nice day",
        "analyzer": "stop"
      }
    }
  }
}

1b)、建立索引时字段指定search_analyzer字段

//指定search_analyzer参数时同时一定要指定analyzer
PUT full_field_search_analyzer_index
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "analyzer": "whitespace",
        "search_analyzer": "simple"
      }
    }
  }
}

1c)、建立索引时指定默认的查询analyzer
可以在建立索引时指定索引默认的查询analyzer,参数:analysis.analyzer.default_search;
若默认的查询analyzer指定,则同时也需要指定默认索引analyzer,参数:analysis.analyzer.default;

PUT full_default_search_analyzer_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{
          "type":"simple"
        },
        "default_search":{
          "type":"whitespace"
        }
      }
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8.1.2-elasticsearch文本解析之自定义分词器及分词器匹配规则 的相关文章

随机推荐

  • 如何使用 Python WebSSH 从浏览器连接到终端

    介绍 通常 您使用终端中的命令行应用程序或包含 SSH 客户端的终端仿真器软件连接到 SSH 服务器 一些工具 例如 Python 的WebSSH 可以通过 SSH 连接并直接在 Web 浏览器中运行终端 这在许多情况下都很有用 当以具有视
  • 在 Ubuntu 18.04 上使用 Nginx 安装 WordPress

    WordPress是最受欢迎的开源内容管理系统 CMS 之一 与 Drupal 或 Joomla 等其他 CMS 相比 拥有高达 60 的市场份额 WordPress 可用于开发任何类型的网站 无论是博客 小型企业还是大型企业 凭借其免费和
  • Java中的模板方法设计模式

    模板方法是行为设计模式 模板方法设计模式用于创建方法存根并将某些实现步骤推迟到子类 模板方法设计模式 模板方法定义了执行算法的步骤 并且它可以提供可能对所有或某些子类通用的默认实现 让我们通过一个例子来理解这个模式 假设我们想提供一种建造房
  • 如何在虚拟专用服务器上配置 Nginx Web 服务器

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化

    介绍 蟒蛇pandas包用于数据操作和分析 旨在让您以直观的方式处理标记数据或关系数据 The pandas软件包提供了电子表格功能 但由于您使用的是 Python 因此它比传统的图形电子表格程序更快 更高效 在本教程中 我们将介绍如何设置
  • 如何使用 Nginx 创建临时和永久重定向

    介绍 HTTP重定向是将一个域或地址指向另一个域或地址的方法 有几种不同类型的重定向 每种重定向对于客户端浏览器来说都有不同的含义 两种最常见的类型是临时重定向和永久重定向 临时重定向 响应状态码302 找到 如果临时需要从不同位置提供 U
  • 如何在 Ubuntu 12.04 LTS 上设置 nginx 虚拟主机(服务器块)

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • Hibernate 多对多映射 - 连接表

    今天我们将研究Hibernate 多对多映射使用 XML 和注释配置 之前我们研究过如何实施一对一 and 一对多映射在休眠状态下 休眠多对多 多对多映射通常在数据库中使用连接表 例如我们可以有Cart and Item表和Cart Ite
  • 春季面试问题及解答

    我发了很多帖春季教程最近 这篇文章将帮助您解决 Spring 面试问题 详细解释核心概念 Spring框架是最流行的 Web 应用程序 Java EE 框架之一 依赖注入面向方面编程是 Spring 框架的核心 如果你擅长 Spring 框
  • 运算符

    运算元 运算符应用的对象 1 2 3 1 2就是运算元 一元运算符 只有一个运算元的运算符 var a 1 a a 表达式 由运算符和变量 常量组成的式子 a 1 1 2 3 5 5 4 a b c d 常见的数学运算符 指数 多个数字和字
  • 电子科技大学软件工程期末复习笔记(三):需求分析

    目录 前言 重点一览 需求分析 需求的定义 需求的特性 功能性需求与非功能性需求 需求分析的四个步骤 结构化需求分析方法 结构化需求分析建模的核心 围绕该核心建立的三种图 绘制数据流图 重点 绘制数据流图实例 面向对象分析 面向对象分析的三
  • 网络中的注意力机制-CNN attention

    网络中的注意力机制 CNN attention 前言 网络结构 SEnet CBAM GSoP Net AA Net ECA Net 前言 Attention机制就是加权 目前实现形式主要包括三个方面 CNN Attention 图像 RN
  • 百度飞浆行人多目标跟踪笔记

    开源地址 PaddleDetection configs mot at release 2 3 PaddlePaddle PaddleDetection GitHub 百度飞浆集成了多目标跟踪的多种算法 地址 PaddleDetection
  • 基于MES系统的离散制造车间的设备,实现设备全方位维护

    离散制造的产品多为多品种小批量 生产组织复杂 计划排产困难 需要综合考虑人机料各种因素 另外 临时插单多 多数订单具有定制化特点 车间质量 工艺等异常多 造成生产节奏不稳定 进而影响设备维保执行的及时性 规范性 造成设备的突发故障较多 若设
  • Apache架构师都遵循的30条设计原则

    Srinath 通过不懈的努力最终总结出了 30 条架构原则 他主张架构师的角色应该由开发团队本身去扮演 而不是专门有个架构师团队或部门 Srinath 认为架构师应该扮演的角色是一个引导者 讨论发起者 花草修建者 而不是定义者和构建者 S
  • java audioinputstream 读取音频文件,从最初获得高达一些X字节的AudioInputStream(切割音频文件)...

    How can i read an AudioInputStream upto a particular number of bytes microsecond position For example AudioInputStream a
  • SDRAM操作说明——打开DDR3的大门

    SDRAM synchronous dynamic random access memory 同步动态随机存储器 所谓同步就是指需要时钟信号来控制命令数据 动态是指存储阵列需要不断地刷新来保证数据不会丢失 随机是指存取数据可以根据需要在不同
  • 参考文献中英文人名_参考文献英文名字应该怎么写?

    展开全部 名字的缩写 学位的缩写只有PhD MD BD等 英文文献好像是不标学位的 对于英文参考文献 还应注意以e5a48de588b662616964757a686964616f31333431363664下两点 1 作者姓名采用 姓在前
  • Omni Core v0.11.0 rpc-api

    JSON RPC API Omni Core 是 Bitcoin Core 的一个分支 在上面添加了 Omni 协议功能支持作为一个新的功能层 因此 与 API 的交互以与比特币核心相同的方式 JSON RPC 完成 只需使用额外的 RPC
  • 8.1.2-elasticsearch文本解析之自定义分词器及分词器匹配规则

    创建自定义analyzer 在具体的业务场景当中可能内置的analyzer并不能满足需求 这就需要能够自定义analyzer 前文已经说过analyzer由3部分组成 自定义analyzer就是通过配置以下三部分内容来实现的 序号 子构件