点击上方“方才编程”,即可关注我!

本文导读

本文仿照QQ的用户搜索,搭建一个中文+拼音的混合检索系统,并高亮显示检索字段。全文共分为以下几部分:

  • 1、项目简介,包括需求描述与分析等;

  • 2、项目开发,通过两个版本的index,验证并完成需求;

  • 3、从分词和高亮原理入手,深度分析高亮显示问题;

  • 4、SpringBoot+RestHighLevelClient 完成项目开发。

【ps:留言区附完整版项目源码地址】

01 项目简介

本项目基于ElasticSearch 7.7.1,analysis-pinyin 7.7.1,参考QQ的用户搜索效果,完成一个中文+拼音的混合检索系统。(ElasticSearch的安装请参考在docker中安装ES)

1.1 检索场景示例

中文+首字母+全拼检索

其实QQ的用户检索是有很多限制的,比如说首字母检索时,必须从第一个字开始匹配【输入“gz”,可以检索到“关注我”,但是不能检索到“我关注”】;

再比如说全拼+首字母检索时,全拼必须在前面【输入“guanz”,可以检索到“关注我”,但是输入“gzhu”,是不能检索到结果的】;

至于为什么会有如此限制,个人猜测是考虑检索性能(PS:欢迎留言讨论)。

1.2 检索需求描述

参考QQ,列出“用户检索系统”的需求如下:

  • 1)支持首字母检索;

  • 2)支持首字母+全拼检索;

  • 3)支持中文+首字母+全拼混合检索;

  • 4)检索词有中文,则必须包含;

  • 5)高亮显示检索命中词。

1.3 需求分析

从需求1,可知,需要建立【首字母的倒排索引】;

从需求2,可知,需要建立【全拼的倒排索引】;

02 项目开发

2.1 第一个版本

根据上面的分析,参考 analysis-pinyin 官网,创建了第一版index:

ps:关于 analysis-pinyin 各个配置项的含义可参考官网
PUT /user_index/
{"settings": {"index": {"number_of_shards": 1,"number_of_replicas": 1},"analysis": {"analyzer": {"pinyin_analyzer": {"tokenizer": "my_pinyin"}},"tokenizer": {"my_pinyin": {"type": "pinyin","keep_first_letter": true,"keep_separate_first_letter": true,"keep_full_pinyin": true,"keep_original": false,"limit_first_letter_length": 16,"lowercase": true}}}},"mappings": {"dynamic": false,"properties": {"nickName": {"type": "keyword","fields": {"pinyin": {"type": "text","store": false,"analyzer": "pinyin_analyzer"}}}}}
}

使用_analyze接口,看下分词效果:

GET user_index/_analyze
{"field": "nickName.pinyin","text": ["关注我"]
}# 结果如下:
{"tokens" : [{"token" : "g","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 0},{"token" : "guan","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 0},{"token" : "gzw","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 0},{"token" : "z","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 1},{"token" : "zhu","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 1},{"token" : "w","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 2},{"token" : "wo","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 2}]
}

一切都ok,好像能满足需求,插入几条数据,验证下:

POST _bulk
{"index":{"_index":"user_index","_id":"1"}}
{"nickName":"关注我"}
{"index":{"_index":"user_index","_id":"2"}}
{"nickName":"我关注"}
{"index":{"_index":"user_index","_id":"3"}}
{"nickName":"系统学ES就关注我"}
{"index":{"_index":"user_index","_id":"4"}}
{"nickName":"系统学ES"}

试试检索效果:

GET /user_index/_search
{"query": {"match_phrase": {"nickName.pinyin": "guanz我"}}
}
结果如下:"hits" : [{"_index" : "user_index","_type" : "_doc","_id" : "1","_score" : 1.9991971,"_source" : {"nickName" : "关注我"}},{"_index" : "user_index","_type" : "_doc","_id" : "3","_score" : 1.4875543,"_source" : {"nickName" : "系统学ES就关注我"}}]

经过测试,发现是可以满足需求1、2、3的(有兴趣的小伙伴可以自己试试哟)。

但别忘了,我们还有需求4和5,关于需求4,可以简单的使用 post_filter 后置过滤完成需求。

对于高亮显示,ES本身是提供了 highlight 语法的,写个DSL验证一下:

# 检索语句
GET /user_index/_search
{"query": {"match_phrase": {"nickName.pinyin": "guanz我"}},"highlight": {"fields": {"nickName.pinyin": {}}}
}
# 部分结果     {"_index" : "user_index","_type" : "_doc","_id" : "1","_score" : 1.9991971,"_source" : {"nickName" : "关注我"},"highlight" : {"nickName.pinyin" : ["<em></em><em></em><em></em>关注我"]}}

发现居然没办法高亮!这可不行呀,这么简单的需求,必须实现了!

通过阅读 ES官方文档 + 不断尝试,终于找到原因,完美解决。

2.2 第二版

ElasticSearch实战系列02:中文+拼音混合检索,并高亮显示相关推荐

  1. ElasticSearch实战系列02 SpringBoot + ElasticSearch 7.7 实现高仿QQ用户搜索:中文+拼音混合检索,并高亮显示

    本文导读 本文仿照QQ的用户搜索,搭建一个中文+拼音的混合检索系统,并高亮显示检索字段.全文共分为以下几部分: 1.项目简介,包括需求描述与分析等: 2.项目开发,通过两个版本的index,验证并完成 ...

  2. Elasticsearch 多语言及中文分词与检索详解

    文章目录 1. 自然语言与查询 Recall 2. 混合多语言的挑战 3. 分词的挑战 4. 中文分词方法的演变 - 字典法 5. 中文分词方法的演变 - 基于统计法的机器学习算法 6. 中文分词器现 ...

  3. ElasticSearch实战系列十一: ElasticSearch错误问题解决方案

    前言 本文主要介绍ElasticSearch在使用过程中出现的各种问题解决思路和办法. ElasticSearch环境安装问题 1,max virtual memory areas vm.max_ma ...

  4. ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合

    Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...

  5. Elasticsearch 5.5.1 中文/拼音分词 亲测有效

    所有不说明elastic 版本的博客都是耍流氓 . --某码农 原文链接 版本如题.拼音和中文分词一起的整个测试流程如下: 预备 删除 index DELETE /index_name/ { } 创建 ...

  6. es拼音分词 大帅哥_SpringBoot集成Elasticsearch 进阶,实现中文、拼音分词,繁简体转换...

    Elasticsearch 分词 分词分为读时分词和写时分词. 读时分词发生在用户查询时,ES 会即时地对用户输入的关键词进行分词,分词结果只存在内存中,当查询结束时,分词结果也会随即消失.而写时分词 ...

  7. Elasticsearch实战(四)---中英文分词及拼音搜索

    Elasticsearch实战-中英文分词及拼音搜素 文章目录 Elasticsearch实战-中英文分词及拼音搜素 1.ElasticSearch 中英文分词插件 1.1 分词插件 1.2 默认分词 ...

  8. java search 不能使用方法_ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程

    前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...

  9. Elasticsearch 实战 - 第四讲:ES 高级查询

    Elasticsearch 实战 - 第四讲:ES 高级查询 Elasticsearch 实战系列文章: 一.高级查询 1.简介 2.结果排序 3.分页查询 4.检索查询 5.关键字查询 6.高亮显示 ...

最新文章

  1. python的执行效率没有c语言高,Python代码优化
  2. 用g++编译C++ 的流程示例如下
  3. 咨询业或将危害电力信息化进程?
  4. c++ 利用内存映射读取大文件
  5. 1200plc 虚拟轴_泡沫轴,哪里酸痛滚哪里,还能滚出完美曲线!
  6. 数据集特征提取_基于PCA算法实现鸢尾花数据集的特征提取任务
  7. 13个AJAX验证框架
  8. CG-CTF-Web-这题不是WEB
  9. Spring Boot + JPA + Oracle 自增长字段实现示例
  10. mysql主流版本2020_mysql高级2020.7.12-2020.7.13
  11. linux v4l2 示例程序,linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)...
  12. python机器学习库sklearn——模型评估
  13. 自然语言处理基本概念及基础工具
  14. 零基础自学软件测试-项目经验-电商项目实战-测试用例设计-促销中心
  15. windows系统——更改系统关机音效
  16. Mac SublimeREPL一点经验
  17. Html和css 两张图片叠加一起
  18. 毕业生社保、档案和户口详解 1
  19. MySQL索引和B+Tree底层原理
  20. android pay 教程,移动支付框架-AndroidPay

热门文章

  1. OSError: [WinError 1455] 页面文件太小,无法完成操作
  2. 对蜜蜂CCD原因调查
  3. 在c语言中1和0的意思,!1在c语言中是什么意思?
  4. 北航2022软件工程第二次作业——产品评测、分析与规划
  5. 金蝶开发中根据实体查找bostype,再根据bostype规则,生成对应的id
  6. 浅谈虚拟机的垃圾回收
  7. 二、谈谈对数据库中索引的理解
  8. 微信小程序实现关注与取消关注功能
  9. 解决org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ 1. No runnable methods
  10. 按键精灵安卓版去除重复数组然后排序排序