前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章参考网上的课程,介绍Elasticsearch搜索引擎之自动补全功能的介绍与使用,这块内容不作为面试中的重点。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
以下正文开始
拼音分词器
当我们再很多网站输入拼音,关键字时,会出现商品,词语,与之有关联的的自动补全功能,可以帮助用户搜索到自己想要的结果。
Elasticsearch恰好能帮助我们完成这一业务。想要使用拼音来搜索商品,就需要使用拼音分词,根据字母做补全功能,就需要对文档按照拼音来分词。
首先我们需要安装拼音分词插件,将拼音分词插件下载到挂载的es-plugins目录下。下载完成后,我们可以测试一下是否可以,DSL代码如下:
POST /_analyze
{
"text": ["小威要向诸佬学习呀"],
"analyzer": "pinyin"
}
发送请求可以看到确实是按照拼音分词得到的结果,在创建索引库的时候可以以拼音分词的形式来创建:
自定义分词器
上面我们演示了使用拼音来做分词,但是上面是根据单个和组合的拼音来做分词的。在生产环境中,我们往往需要以拼音和汉字词语一起作为分词,这就需要我们来自定义分词器了。
elasticsearch中分词器(analyzer)的组成包含三部分:
- character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
- tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
- tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
我们可以在创建索引库时,通过settings来配置自定义的分词器(analyzer):
// 自定义拼音分词器
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": { //自定义tokenizer filter
"py": { //过滤器名称
"type": "pinyin", //过滤器类型为pinyin
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text"
"analyzer": "my_analyzer"//分词使用自定义分词器
, "search_analyzer": "ik_smart"//搜索使用ik分词器
}
}
}
}
在上面创建的索引库中放入两条文档:
{
"id": 1,
"name": "狮子"
}
POST /test/_doc/2
{
"id": 2,
"name": "虱子"
}
由于搜索时设置的根据ik_smart分词器进行分词,所以搜索结果只有狮子一条:
为了避免搜索到同音字,在创建索引库是时使用拼音分词器,在搜索时尽量不用。
completion suggester
es提供了completion suggester查询来实现自动补全功能,这个查询的概念就是匹配用户输入内容开头的词条并返回,对于文档中字段的类型,要遵循:参与补全查询的字段必须是completion类型;并且字段值是多个词条形成的数组。
举个栗子:
第一步,创建自动补全的索引库
# 创建自动补全的索引库
PUT test2
{
"mappings": {
"properties": {
"title":{
"type": "completion"
}
}
}
}
第二步,在创建的索引库中插入几条补全数据:
# 示例数据
POST test2/_doc
{
"title": ["Sony", "WH-1000XM3"]
}
POST test2/_doc
{
"title": ["SK-II", "PITERA"]
}
POST test2/_doc
{
"title": ["Nintendo", "switch"]
}
第三步,编写DSL语句,实现自动补全功能:
# 自动补全查询
POST /test/_search
{
"suggest": {
"title_suggest": {
"text": "s", // 搜索关键字s开头的数据
"completion": {
"field": "title", // 补全字段
"skip_duplicates": true, // 跳过重复的
"size": 10 // 获取前10条结果
}
}
}
}
执行上述的DSL语句,得到如下查询结果:
图书推荐
本期推荐阅读书籍,鳄鱼书:《 健壮的Python》
《 健壮的Python》,英文原书名为《Robust Python》,顾名思义,就是教我们如何写出更加“健壮”的代码,不易出错,且能长时间的进行修改和维护。Python 本身的语法和概念非常简单,很多人甚至都觉得这是一门不需要刻意学习的语言(相比 Rust,Scala 等)。但看了这本书才发现原来写出高质量的工程代码有这么多的讲究!
在这本实用的书中,作者Patrick Viafore将告诉你如何大限度地使用 Python的类型系统。你将看到用户定义的类型(如类和枚举),以及Python的类型提示系统。你还将学习如何使Python代码具有可扩展性,以及如何基于一个全面的测试策略构建安全网。利用这些知识和技术,你将编写更清晰、更易于维护的代码。
阅读收获
通过学习本书,你将:
- 了解为什么类型在现代开发生态系统中是必不可少的。
- 了解类、字典和枚举等类型选择是如何反映特定意图的。
- 在不加剧臃肿的情况下使Python代码在未来可扩展。
- 使用流行的Python工具来提高代码库的安全性和健壮性。
- 评估当前的代码以检测常见的可维护性问题。
- 通过linter和测试构建代码库的安全网。
本书结构
本书涵盖了非常广泛的知识,主要分为四个部分:
- 第1部分“为代码添加类型注解”。介绍类型检查如何在保证健壮性的工作中扮演重要角色。
我们将从 Python 中的类型开始。类型是语言的基础,但开发人员往往没有对其进行详细检查。开发人员选择的类型很重要,因为它们传达了非常具体的意图。我们将介绍类型注解以及要与开发人员沟通的具体注解。我们还将介绍类型检查器以及它们是如何帮助开发人员在早期捕获 bug 的。
- 第2部分“定义你自己的类型”。用面向对象的思维增加代码的健壮性。
在介绍了如何考虑Python 的类型之后,我们将重点关注如何创建自己的类型。我们将深人讨论枚举、数据类和类,并探讨在设计类型时特定的选择会如何增加或减少代码的健壮性。
- 第3部分“可扩展的Python”。借助一些设计思想和常见架构,进一步提升代码质量。
在学习了如何更好地表达你的意图之后,我们将重点关注如何使开发人员能够轻松地更改你的代码,并在你的基础上充满信心地构建代码。我们将讨论可扩展性、依赖关系和架构模式方面的问题,这些方面使你可以在最小的影响下修改系统。
- 第4部分“构建安全网”。用静态检查和测试完善整个代码的安全网。
最后,我们特探讨如何构建一个安全网,这样你說可以在未来的合作者失误时招助他们。他们的信心会因此而增强,因为他们会知道自己有一个强大的、健壮的系统,可以无所畏俱地用于他们的用例。最后,我们将介绍各种静志分析和测试工具,它们将帮助你捕获惡意的行为。
读者得以从四个不同的角度了解各种Python技巧,并借助其中的例子加强“编写良好代码”(不只是Python)的意识。每一章基本上都是独立的,你既可以按照顺片从头到尾问读,也可以根据自己的需求阅读相应的章节。各部分中的章节相互关联,但各个部分之间的关联较少。所有代码示例都是用 Python 3.9.0 运行。
希望阅读此书的读者都能有所收获,并能够将其中一些做法或者思想应用到自己的职业生涯或者编码工作中。
京东购买链接:点击了解
评论区任意留言可参与活动抽奖(评论最多三条,抽取四名欧皇)
好了,本篇文章就先分享到这里了,后续会继续分享其他方面的知识,感谢大佬认真读完支持咯~
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞文章来源:https://www.toymoban.com/news/detail-413835.html
文章来源地址https://www.toymoban.com/news/detail-413835.html
到了这里,关于网页搜索自动补全功能如何实现,Elasticsearch来祝佬“一臂之力”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!