带你读《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;
相关文章
|
11月前
|
编解码 人工智能 安全
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
309 20
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
|
11月前
|
算法 JavaScript
基于遗传优化的Sugeno型模糊控制器设计matlab仿真
本课题基于遗传优化的Sugeno型模糊控制器设计,利用MATLAB2022a进行仿真。通过遗传算法优化模糊控制器的隶属函数参数,提升控制效果。系统原理结合了模糊逻辑与进化计算,旨在增强系统的稳定性、响应速度和鲁棒性。核心程序实现了遗传算法的选择、交叉、变异等步骤,优化Sugeno型模糊系统的参数,适用于工业控制领域。
GitHub——如何生成Personal access tokens
GitHub——如何生成Personal access tokens
172 0
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
479 4
|
算法 安全 数据安全/隐私保护
TLS 1.3 相比 TLS 1.2 在性能上有哪些提升
TLS 1.3 相比 TLS 1.2 在性能上有哪些提升
582 4
|
存储 数据采集 弹性计算
日志服务SLS入门指南
简述日志服务SLS及日志采集、信息脱敏和告警接入相关操作
|
测试技术
提升软件测试效率的五大策略
【10月更文挑战第13天】 本文将探讨如何通过优化测试流程、引入自动化测试、加强测试用例设计、培养高素质测试团队和持续反馈改进等五大策略,来显著提升软件测试的效率。这些方法不仅适用于不同类型的软件项目,还能有效降低测试成本,提高软件质量。
1250 0
|
机器学习/深度学习 人工智能 数据可视化
【人工智能】人工智能可解释性和透明度的详细探讨
人工智能的可解释性和透明度是当前AI领域的重要议题,它们对于AI系统的公正性、可靠性、用户信任以及合规性等方面都具有深远的影响。以下是对人工智能可解释性和透明度的详细探讨
1246 1
|
Linux C语言 开发者
Damn!linux想做单细胞想下载Seurat,依赖包stringi要怎么安装
**摘要:** 《R包stringi安装挑战与解决方案》 `stringi`是R中的关键字符串处理包,基于ICU库,常用于生物信息学和统计分析。安装时常遇到问题,特别是在Linux上,因平台依赖和C库版本而复杂。解决办法包括检查GCC版本、网络和环境。当常规方法失败时,可尝试手动下载ICUDT,设置`configure.vars`或通过源码安装:下载zip,构建,然后使用R CMD安装。遇到类似问题的开发者可参考提供的链接和步骤。安装问题多样,需灵活应对。
430 2
|
机器学习/深度学习 分布式计算 算法
掌握XGBoost:分布式计算与大规模数据处理
掌握XGBoost:分布式计算与大规模数据处理
677 3

热门文章

最新文章