从零搭建 ES 搜索服务(四)拼音搜索
一、前言
上篇介绍了 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 搜索服务(四)拼音搜索的更多相关文章
- 从零搭建 ES 搜索服务(二)基础搜索
一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...
- 从零搭建ES搜索服务(一)基本概念及环境搭建
一.前言 本系列文章最终目标是为了快速搭建一个简易可用的搜索服务.方案并不一定是最优,但实现难度较低. 二.背景 近期公司在重构老系统,需求是要求知识库支持全文检索. 我们知道普通的数据库 like ...
- 从零搭建 ES 搜索服务(三)同义词搜索
一.前言 上篇介绍了 ES 的基础搜索,能满足我们基本的需求,然而在实际使用中还可能希望搜索「番茄」能将包含「西红柿」的结果也罗列出来,本篇将介绍如何实现同义词之间的搜索. 二.安装 ES 同义词插件 ...
- 从零搭建 ES 搜索服务(六)相关性排序优化
一.前言 上篇介绍了搜索结果高亮的实现方法,本篇主要介绍搜索结果相关性排序优化. 二.相关概念 2.1 排序 默认情况下,返回结果是按照「相关性」进行排序的--最相关的文档排在最前. 2.1.1 相关 ...
- 从零搭建 ES 搜索服务(五)搜索结果高亮
一.前言 在实际使用中搜索结果中的关键词前端通常会以特殊形式展示,比如标记为红色使人一目了然.我们可以通过 ES 提供的高亮功能实现此效果. 二.代码实现 前文查询是通过一个继承 Elasticsea ...
- 从零搭建一个Redis服务
前言 自己在搭建redis服务的时候碰到一些问题,好多人只告诉你怎么成功搭建,但是并没有整理过程中遇到的问题,所有楼主就花了点时间来整理下. linux环境安装redis 安装中的碰到的问题和解决办法 ...
- 从零搭建SSM框架(四)手动实现Tomcat部署
发布War包 Windows环境部署 增加如下配置 <Context path="/" docBase="cnki" debug="0" ...
- 开放搜索服务OpenSearch
开放搜索服务系统架构:从系统.平台到开放服务 搜索是各类网站和数据类APP的标配功能.目前开发者一般基于开源搜索系统,例如ElasticSearch.Solr.Sphinx等自己搭建搜索服务,系统定制 ...
- Sharepoint 2013搜索服务配置总结(实战)
分享人:广州华软 星尘 一. 前言 SharePoint 2013集成了Fast搜索,相对于以前版本搜索的配置有了一些改变,在安装部署Sharepoint 2013时可以选择默认创建搜索服务,但有时候 ...
随机推荐
- oracle提高查询效率的34条方法
注:本文来源:远方的守望者 <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解 ...
- nodejs之glob与globby
glob glob允许使用规则,从而获取对应规则匹配的文件.这个glob工具基于javascript.它使用了 minimatch 库来进行匹配 安装 npm install glob 引入 cons ...
- python之属性描述符与属性查找规则
描述符 import numbers class IntgerField: def __get__(self, isinstance, owner): print('获取age') return se ...
- NIO(四)
使用非直接缓冲区和直接缓冲区复制同一个文件,看一下时间差别 1.创建非直接缓冲区测试类 package com.cppdy.nio; import java.io.FileInputStream; i ...
- Linux基础实操三
实操一: 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cd /etc -->tar passwd * group * > 1.txt 2) 将用户信 ...
- html 基本指令
命令: <pre> </pre> 格式化输出 <ol></ol> 有序 HTML 列表:示例: <pre> here is outout & ...
- mysql登录报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问 对于出现拒绝访问root用户的解决方案错 ...
- Axure实现多用户注册验证
*****多用户登录验证***** 一.(常规想法)方法:工作量较大,做起来繁琐 1.当用户名和密码相同时怎么区分两者,使用冒号和括号来区分: eg. (admin:123456)(123456:de ...
- AI学习吧-Redis操作-事务、订阅
事务 #首先启动redis服务端和客户端:#关于事务,数据库中的事务指的是逻辑上的一组操作,这组操作要么都执行成功要么不执行成功,出现异常会回滚到初始状态. 在代码中加入xxx,代码报错的话,不会执行 ...
- C#的值传递与引用传递
值传递:在使用值传递时,是把变量的值传给函数,函数中对此变量的任何修改都不影响该变量本身的值. 引用传递:使用引用传递时,在函数中对此变量的修改会影响变量的值. 说简单点,值传递,就是我把身份证复印件 ...