一、前言

上篇介绍了 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 搜索服务(四)拼音搜索的更多相关文章

  1. 从零搭建 ES 搜索服务(二)基础搜索

    一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...

  2. 从零搭建ES搜索服务(一)基本概念及环境搭建

    一.前言 本系列文章最终目标是为了快速搭建一个简易可用的搜索服务.方案并不一定是最优,但实现难度较低. 二.背景 近期公司在重构老系统,需求是要求知识库支持全文检索. 我们知道普通的数据库 like ...

  3. 从零搭建 ES 搜索服务(三)同义词搜索

    一.前言 上篇介绍了 ES 的基础搜索,能满足我们基本的需求,然而在实际使用中还可能希望搜索「番茄」能将包含「西红柿」的结果也罗列出来,本篇将介绍如何实现同义词之间的搜索. 二.安装 ES 同义词插件 ...

  4. 从零搭建 ES 搜索服务(六)相关性排序优化

    一.前言 上篇介绍了搜索结果高亮的实现方法,本篇主要介绍搜索结果相关性排序优化. 二.相关概念 2.1 排序 默认情况下,返回结果是按照「相关性」进行排序的--最相关的文档排在最前. 2.1.1 相关 ...

  5. 从零搭建 ES 搜索服务(五)搜索结果高亮

    一.前言 在实际使用中搜索结果中的关键词前端通常会以特殊形式展示,比如标记为红色使人一目了然.我们可以通过 ES 提供的高亮功能实现此效果. 二.代码实现 前文查询是通过一个继承 Elasticsea ...

  6. 从零搭建一个Redis服务

    前言 自己在搭建redis服务的时候碰到一些问题,好多人只告诉你怎么成功搭建,但是并没有整理过程中遇到的问题,所有楼主就花了点时间来整理下. linux环境安装redis 安装中的碰到的问题和解决办法 ...

  7. 从零搭建SSM框架(四)手动实现Tomcat部署

    发布War包 Windows环境部署 增加如下配置 <Context path="/" docBase="cnki" debug="0" ...

  8. 开放搜索服务OpenSearch

    开放搜索服务系统架构:从系统.平台到开放服务 搜索是各类网站和数据类APP的标配功能.目前开发者一般基于开源搜索系统,例如ElasticSearch.Solr.Sphinx等自己搭建搜索服务,系统定制 ...

  9. Sharepoint 2013搜索服务配置总结(实战)

    分享人:广州华软 星尘 一. 前言 SharePoint 2013集成了Fast搜索,相对于以前版本搜索的配置有了一些改变,在安装部署Sharepoint 2013时可以选择默认创建搜索服务,但有时候 ...

随机推荐

  1. html table

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. LeetCode(117):填充同一层的兄弟节点 II

    Medium! 题目描述: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *n ...

  3. cf1107e uva10559区间dp升维

    /* 区间dp,为什么要升维? 因为若用dp[l][r]表示消去dp[l][r]的最大的分,那么显然状态转移方程dp[l][r]=max{dp[l+1][k-1]+(len[l]+len[k])^2+ ...

  4. js call() 笔记

    var ctrl = function() {}; ctrl.view = function() { return { show: function() { console.log("vie ...

  5. PAT Basic 1073. 多选题常见计分法

    题目内容 多选题常见计分法(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 批改多选题是比较麻烦的事情,有 ...

  6. 【bzoj4631】踩气球 线段树

    题解: 真是很zz 我都想到线段树分治的思路了... 不过还是一道好题 首先跟线段树分治一样将区间投射到线段树上去 每次修改如果该个区间修改为0,则对他们对应的特定区间-1 这样每个区间会有一次变0, ...

  7. Ng Alain使用 - cli和克隆两种方式

    感觉没啥要写的,但是在查看相关资料的过程中发现不少浮夸的人,可以说是完全不阅读官方文档,操作完全无厘头,,创建了删,配置,再删除,,,扯蛋....., 方式一:CLI(推荐) # 确保使用的是最新版本 ...

  8. 【Codeforces】Gym100633 D. LWDB

    题解 点分治,然后每个点上挂着一个距离不超过\(a_{i}\)的颜色改成\(c\) 用一个单调栈维护距离单调递减,每次查询在每个包括这个点的分治中心的单调栈上二分,找到修改最靠前的颜色作为这个点的颜色 ...

  9. 批处理打开关闭服务(ArcSDE+Oracle92的)

    转自:http://crmhf.blog.163.com/blog/static/7707820320097199560516/ 批处理打开服务:echo offnet start "Arc ...

  10. Vim的合并行操作

    日常常用到多行合并的功能,记录如下: 第一种, 多行合并成一行,即: AAAAABBBBBCCCCC 合并为:AAAAA BBBBB CCCCC 方法1: normal状态下 3J 其中的3是范围,可 ...