从零搭建 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时可以选择默认创建搜索服务,但有时候 ...
随机推荐
- Confluence 6 虚拟文件和文件夹
在取消点赞事件中,你可能会遇到 WebDAV 客户端的问题或者不稳定的情况,你可以启用访问自动创建(虚拟)文件和文件夹. 备注: 在默认情况下,这个选项隐藏在 'WebDAV Configurati ...
- day11 函数的位置形参,位置实参,可变长位置形参,关键字形参
今天内容 函数的参数详解 形参与实参 形参及形式参数,就是在定义函数是括号中指定的参数(本质就是一个名字) 实参及实际参数,指的是在调用函数是传入的参数)(本质就是一个值) 在调用函数是就会把形参和实 ...
- maven添加镜像与常用配置
maven解压后conf文件夹有个 settings.xml 在这个文件中可以配置我们的maven 配置镜像: 找到<mirrors></mirrors>找到这个节点在节点中添 ...
- json的转换操作
toJSON 把JS对象{ 'x': 2, 'y': 3 }转为JSON对象格式的字符串 不能转化字符串 比如"{ 'x': 2, 'y': 3 }" 可以转格式不标准的jso ...
- HTMLTestRunner 美化版本
前言 最近小伙伴们在学玩python,,看着那HTMLTestRunner生成的测试报告,左右看不顺眼,终觉得太丑.搜索了一圈没有找到合适的美化报告,于是忍不住自已动手进行了修改,因习惯python ...
- 步步为营-89-SQL语句(删除重复数据)
1:删除重复数据 --第一步:先找到重复数据 select ProcInstID from record_errorlog group by ProcInstID having count(ProcI ...
- PV-UV-QPS
QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...
- Java生成生成密码类
import java.util.Date; import java.util.Random; public class PasswordUtil { public final static Stri ...
- Elasticsearch snapshot 备份的使用方法 【备忘】
常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失.虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制. ...
- [转] meta标签的作用及整理
meta的标签的使用是我在前端学习中曾经困惑过一段时间的问题.一方面不是很了解meta标签的用途,另一方面是对于meta标签里的属性和值不是懂,也不知道从哪里冒出来的,所以这篇文章专门整理下meta标 ...