从零搭建 ES 搜索服务(四)拼音搜索

摘要:
3.1具体配置① 修改上一节中新创建的“yb_knowledge.json”模板中的“设置”配置,添加自定义分析器“analysis”:{“filter”:}…忽略其余的…“pinyin_filter”:{“type”:“pinyin”,“keep_first_letter”:true,“keep.parate_first_letter”:false,“keep_full_pinyin”:true、“keep_joined_full_pin”:true;“none_chinese_pinyin_tokenize”:false、“keep_joined_fall_pinyin”:true n“:true,”remove_uplicated_term“:true、”keep_original“:true”,“limit_first_letter_length”:50,”小写字母“:true}}”,“分析器”:{…忽略其余…“ik_synonym_pinyin”:{“type”:“custom”,“token”:“ik_smart”、“filter”:。

一、前言

上篇介绍了 ES 的同义词搜索,使我们的搜索更强大了,然而这还远远不够,在实际使用中还可能希望搜索「fanqie」能将包含「番茄」的结果也罗列出来,这就涉及到拼音搜索了,本篇将介绍如何具体实现。


二、安装 ES 拼音插件

2.1 拼音插件简介

GitHub 地址:https://github.com/medcl/elasticsearch-analysis-pinyin

2.2 安装步骤

① 进入 ES 的 bin 目录

$ cd /usr/local/elasticsearch/bin/

② 通过 elasticsearch-plugin 命令安装 pinyin 插件

$ ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v5.5.3/elasticsearch-analysis-pinyin-5.5.3.zip

③ 安装成功后会在 plugins 目录出现 analysis-pinyin 文件夹


三、自定义分析器

要使用「拼音插件」需要在创建索引时使用「自定义模板」并在自定义模板中「自定义分析器」。

3.1 具体配置

① 在上篇新建的「 yb_knowledge.json 」模板中修改「 setting 」配置,往其中添加自定义分析器

"analysis": {
    "filter": {
        ...省略其余部分...
        "pinyin_filter":{
            "type": "pinyin",
            "keep_first_letter": true,
            "keep_separate_first_letter": false,
            "keep_full_pinyin": true,
            "keep_joined_full_pinyin": true,                     
            "none_chinese_pinyin_tokenize": false,
            "keep_joined_full_pinyin": true,
            "remove_duplicated_term": true,
            "keep_original": true,
            "limit_first_letter_length": 50,
            "lowercase": true
        }
    },
    "analyzer": {
        ...省略其余部分...
        "ik_synonym_pinyin": {
            "type": "custom",
            "tokenizer": "ik_smart",
            "filter": ["synonym_filter","pinyin_filter"]
        }
    }
}

自定义分析器说明:

  • 首先声明一个新「 token filter 」—— 「 pinyin_filter 」,其中 type 为 pinyin 即拼音插件,其余字段详见 GitHub 项目说明。
  • 其次声明一个新 「analyzer」—— 「ik_synonym_pinyin」,其中 type 为 custom 即自定义类型, tokenizer 为 ik_smart 即使用 ik 分析器的 ik_smart 分词模式, filter 为要使用的词过滤器,可以使用多个,这里使用了上述定义的 pinyin_filter 以及前篇的 synonym_filter 。

② 与此同时修改「 mappings 」中的 properties 配置,往「 knowledgeTitle 」及「 knowledgeContent 」这两个搜索字段里添加 fields 参数,它支持以不同方式对同一字段做索引,将原本的简单映射转化为多字段映射,此处设置一个名为「 pinyin 」的嵌套字段且使用上述自定义的「 ik_synonym_pinyin 」作为分析器。

"mappings": {
    "knowledge": {
        ...省略其余部分...
        "properties": {
            ...省略其余部分...
            "knowledgeTitle": {
                    "type": "text",
                    "analyzer": "ik_synonym_max",
                    "fields":{
                        "pinyin": {
                            "type":"text",
                            "analyzer": "ik_synonym_pinyin"
                        }
                    }
                },
                "knowledgeContent": {
                    "type": "text",
                    "analyzer": "ik_synonym_max",
                    "fields":{
                        "pinyin": {
                            "type":"text",
                            "analyzer": "ik_synonym_pinyin"
                        }
                    }
                }
        }
    }
}

③ 最后删除先前创建的 yb_knowledge 索引并重启 Logstash

注:重建索引后可以通过「_analyze」测试分词结果

curl -XGET http://localhost:9200/yb_knowledge/_analyze
{
    "analyzer":"ik_synonym_pinyin",
    "text":"番茄"
}

注:在添加了同义词「番茄、西红柿、圣女果」的基础上分词结果如下

{
    "tokens": [
        {
            "token": "fan",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 0
        },
        {
            "token": "番茄",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 0
        },
        {
            "token": "fanqie",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 0
        },
        {
            "token": "fq",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 0
        },
        {
            "token": "qie",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 1
        },
        {
            "token": "xi",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 2
        },
        {
            "token": "hong",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 3
        },
        {
            "token": "shi",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 4
        },
        {
            "token": "西红柿",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 4
        },
        {
            "token": "xihongshi",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 4
        },
        {
            "token": "xhs",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 4
        },
        {
            "token": "sheng",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 5
        },
        {
            "token": "nv",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 6
        },
        {
            "token": "guo",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 7
        },
        {
            "token": "圣女果",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 7
        },
        {
            "token": "shengnvguo",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 7
        },
        {
            "token": "sng",
            "start_offset": 0,
            "end_offset": 2,
            "type": "SYNONYM",
            "position": 7
        }
    ]
}

四、结语

至此拼音搜索已经实现完毕,最近两篇都是有关 ES 插件以及 Logstash 自定义模板的配置,没有涉及具体的 JAVA 代码实现,下一篇将介绍如何通过 JAVA API 实现搜索结果高亮。

免责声明:文章转载自《从零搭建 ES 搜索服务(四)拼音搜索》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何进行EMC Symmetrix (DMX或者VMAX)的系统健康检查Linux ifconfig查看网卡信息下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

shiro 框架基本讲解【转载】

shiro 框架基本讲解【转载】 什么是权限管理: 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问...

【SpringSecurity】初识与集成

个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道 如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充 前言 之前介绍过Shiro,作为SpringSecurity的精简版,已经具备了大部分常用功能,且更加便于使用,因而一定程度上成为了SpringSecurity的替代品。 相比之下,SpringSecurity功能更加强大完善,通过调整和...

微信内 H5 页面自定义分享

起源: 最近公司在做一个活动的h5页面,在微信内打开时需要进行微信授权,然后后端会重定向到这个页面并且携带了一些参数(openid等)。问题是点击微信的原生分享时,会把携带的这些参数一起分享出去,等于把用户信息泄露了。所以为了解决这个问题,只能实现自定义微信分享的功能,可以自定义分享的地址、标题、图标还有简介。 事先需要做的: 1.微信公众号:必须是经过...

uboot常用命令详解

dnw:在进入系统之前进入指令行,输入该指令可下载烧录文件。 re:重新启动嵌入式系统。 printenv:打印当前系统环境变量。 setenv:设置环境变量,格式:setenv name value ...,表示将name 变量设置成value 值;如果没有这个参数,表示删除该变量。 saveenv:保存环境变量到NAND中。 sleep:延迟执行,格式...

VS Code找回Settings Sync的gist id和token

按照今天我遇到的情况总结的个人笔记,不担负法律责任,有问题请不吝指教,谢谢。   记录自己遇到的一个问题。。。自己把自己坑了半天。。。所以赶紧记下了,省的过几天忘了   因为当初看配置教程的时候,没注意到输入完token之后还会生成一个gist id。傻乎乎的以为只需要记录下来token就可以了,没有记gist id。   所以在新设备想同步的时候,不知道...

Kafka长文总结

Kafka是目前使用较多的消息队列,以高吞吐量得到广泛使用 特点: 1、同时为发布和订阅提供搞吞吐量。Kafka的设计目标是以时间复杂度为O(1)的方式提供消息持久化能力的,即使对TB级别以上数据也能保证常数时间的访问性能,即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输(一般消息处理是百万级,使用Partition实现机器间的并行处理)...