带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(12)

简介: 带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(12)


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.4.Analyzers / Custom analyzers(11) https://developer.aliyun.com/article/1229762



自定义分词器

 

虽然 Elasticsearch 内置了普通处理方式的分词器,但对于不同的业务场景,当内置的分词器不能满足时,我们可以创建 custom 类型的自定义分词器。根据前面拆解分词器的章节中我们知道一个分词器是由三部分组成,而自定义分词器就是通过在每个阶段选择不同的 filter 进行排列组合来实现的。

 

自定义实现一个分词器

 

自定义分词器需要在索引建立时同时创建,组合一个自定义分词器需要满足以下三个条件:

 

l 0或多个 character filter

l 1个 tokenizer

l 0或多个 token filters

 

配置项

 

type 分词器类型,自定义分词器使用 custom。

 

tokenizer(必填项)文本切分方式,内置 tokenizer 参考。


char_filter(非必填)指定字符过滤器数组。

 

filter(非必填)指定单词过滤器数组。

 

position_increment_gap(非必填,默认100)设置 text 数组中每一个元素首尾增加的间隔。这个设置为了避免查询时当两个不同元素的收尾满足查询条件时匹配。

 

下面的例子创建了一个名为 format_name 的分词器实现把文本中连接线和下划线剔除并转换小写,返回分词结果中第一个单词。分词器配置的过滤器包括:

 

l Character Filter

Mapping Character Filter,将连接线和下划线剔除,过滤器命名为 remove_symbol。

 

l Tokenizer

standard Tokenizer,标准分词器。

 

l Token Filter

Lowercase Token Filter,单词转换为小写字母。

Limit Token Filter,配置只返回结果第一个单词,过滤器命名为 first_word 。


PUT test-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "format_name": {                #1
          "type": "custom",
          "char_filter": [
            "remove_symbol"                #2
          ],
          "tokenizer": "standard",
    761         >   三、产品能力
          "filter": [
            "lowercase",                #3
            "first_word"                
          ]
        }
      },
      "char_filter": {                    
        "remove_symbol": {                #2-1
          "type": "mapping",
          "mappings": [
            "- => ",
            "_ => "
          ]
        }
      },
      "filter": {                        
        "first_word": {                    #3-1
          "type": "limit",
          "max_token_count": 1
        }
      }
    }
  }
}
POST test-000001/_analyze
{
  "analyzer": "format_name",
  "text": [
    "Spider-Man 1",
    "Spider_Man 2",
    "SpiderMan: 3"
  ]
}

#1 自定义过滤器 format_name。

#2 使用 remove_symbol 过滤器进行字符串过滤,根据 Mapping Character Filter 配置得到,需要在 analysis > char_filter 中定义。

#2-1 配置滤器命名为 remove_symbol。

#3 使用 lowercase 转换小写和 first_word 返回第一个单词。first_word 根据 Limit token count filter 配置得到,需要在 analysis > filter 中定义。

#3-1 配置过滤器命名为 first_word。

 

通过 _analyze 实验我们可以看到三个不同的字符串经过处理将返回相同的内容,从而保证在搜索时都能匹配到。

 

{
  "tokens" : [
    {
      "token" : "spiderman",
      "start_offset" : 0,
      "end_offset" : 10,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "spiderman",
      "start_offset" : 11,
      "end_offset" : 21,
      "type" : "<ALPHANUM>",
      "position" : 101
    },
{
      "token" : "spiderman",
      "start_offset" : 22,
      "end_offset" : 31,
      "type" : "<ALPHANUM>",
      "position" : 202
    }
  ]
}

为指定字段使用分词器

 

分词器使用最常见的情况是设置在指定的字段上,通常是针对某一字段的写入或者检索前进行需要分词的处理。而为文本字段指定分词器是在索引创建时发生,在 mapping 中设置文本字段的 analyzer 参数。 下面创建索引请求中设置 movie_name 字段使用 whitespace 分词器。


PUT test-000001
{
  "mappings": {
    "properties": {
      "movie_name": {
        "type": "text",
        "analyzer": "whitespace"
      }
    }
  }

获取文件的类型。当需要根据文件类型搜索时,我们可以通过子字段 file_name.ext 进行匹配。


PUT test-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ext_type": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "file_ext"
          ]
        }
      },
      "filter": {
        "file_ext": {
          "type": "pattern_replace",
          "pattern": """^(.*)\.""",
          "replacement": ""
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "file_name": {
        "type": "text",
        "analyzer": "whitespace", 
        "fields": {
          "ext": {
            "type": "text",
            "analyzer": "ext_type"
          }
        }
      }
    }
  }
}

根据 _analyze API 测试可以看到,结果返回提取到的文件扩展名。

 

POST test-000001/_analyze
{
  "field": "file_name.ext", 
  "text": [
    "logo.png",
    "readme.md",
    "service.login_service.py"
  ]
}
{
  "tokens" : [
    {
      "token" : "png",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "md",
      "start_offset" : 9,
      "end_offset" : 18,
      "type" : "word",
      "position" : 101
    },
    {
      "token" : "py",
      "start_offset" : 19,
      "end_offset" : 43,
      "type" : "word",
      "position" : 202
    }
  ]
}



《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.4.Analyzers / Custom analyzers(13) https://developer.aliyun.com/article/1229756

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
网络协议 Unix C语言
计算机里的套接字到底是什么
【4月更文挑战第3天】套接字在网络编程中扮演着重要角色,类似于电话和电话号码的概念。文章介绍了套接字的基本概念和工作原理,包括服务器端和客户端的初始化、连接建立、数据传输和断开连接的过程。
|
3月前
|
安全 Linux API
OpenClaw能做什么?1分钟阿里云/Win11/Mac/Linux保姆级部署、配置百炼API、集成20个必装Skills及常见问题
“花一下午装好OpenClaw,结果问啥啥不会,让查新闻说没法联网,让整理文件说没权限”——这是很多新手的共同经历。其实,OpenClaw本身只是一个“智能框架”,就像刚出厂的智能手机,只有操作系统却没有任何APP,想要它真正“聪明能干”,关键在于安装和配置合适的Skills(技能)。
676 1
|
3月前
|
数据采集 搜索推荐 应用服务中间件
如何判断网站流量飙升是搜索引擎爬虫导致的?
如何判断网站流量飙升是搜索引擎爬虫导致的?
|
12月前
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
至此,这次神秘而简明的部署之旅告一段落。祝你在利用RabbitMQ打造消息队列时,一切顺风顺水!
760 8
|
Windows
windows 电脑 连接蓝牙耳机没有麦克风
【8月更文挑战第31天】当Windows电脑连接蓝牙耳机后无法使用麦克风时,可尝试以下步骤解决:检查蓝牙设置,确保耳机正确连接并开启麦克风选项;检查音频设备设置,确认蓝牙耳机为默认播放和录制设备;更新蓝牙和音频驱动;确认耳机与系统的兼容性及正确设置。如问题未解,可重新配对耳机或联系客服。
13883 7
|
机器学习/深度学习 资源调度 自然语言处理
长短时记忆网络(LSTM)完整实战:从理论到PyTorch实战演示
长短时记忆网络(LSTM)完整实战:从理论到PyTorch实战演示
20635 0
|
前端开发 JavaScript UED
动态伸缩搜索框:HTML, CSS, JavaScript的完美结合
动态伸缩搜索框:HTML, CSS, JavaScript的完美结合
2854 1
|
监控 数据可视化 项目管理
板栗看板是什么软件?如何使用板栗看板提升团队协作效率?
随着数字化办公的发展,企业和团队急需高效工具来提升协作效率。板栗看板应运而生,它是一款基于“看板管理法”的可视化管理软件,提供任务规划、跟踪和团队协作功能。其核心功能包括看板视图、任务管理、团队协作、项目管理和分析报告,帮助团队简化沟通、明确责任分工、优化工作流程。板栗看板适用于个人和企业,特别是企业版在数据安全、权限管理和跨团队协作方面进行了深度优化,助力大型团队提升管理效率。
691 0
|
XML Java Maven
MockedStatic 用于模拟静态方法
`MockedStatic` 是 Mockito 3.4.0 版本引入的一个功能,用于模拟静态方法。在之前的 Mockito 版本中,模拟静态方法是一项困难的任务,通常需要借助其他工具如 PowerMockito。但是,从 Mockito 3.4.0 开始,你可以使用 `MockedStatic` 类轻松地模拟静态方法。 以下是如何使用 `MockedStatic` 模拟静态方法的示例: 1. 首先,确保你已经添加了 Mockito 的依赖项。对于 Maven 项目,添加以下依赖项: ```xml <dependency> <groupId>org.mockito</groupId
3867 9

热门文章

最新文章