前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >相见恨晚!开源的傻瓜搜索引擎,帮你快速实现搜索功能

相见恨晚!开源的傻瓜搜索引擎,帮你快速实现搜索功能

作者头像
HelloGitHub
发布于 2021-09-09 03:21:33
发布于 2021-09-09 03:21:33
71900
代码可运行
举报
文章被收录于专栏:HelloGitHubHelloGitHub
运行总次数:0
代码可运行

傻瓜一词借鉴自傻瓜相机,又称轻便相机、全自动相机,通常指容易操作针对一般人而设计的小型全自动相机。

在 HelloGitHub 找到有趣、入门级的开源项目,大家好我是卤蛋。说到搜索第一个想到的应该是鼎鼎大名的 Elasticsearch,但 ES 对于个人项目有些重。

今天给大家带来一款轻盈、人人都会用的开源傻瓜搜索引擎——MeiliSearch

https://github.com/meilisearch/MeiliSearch

在介绍 MeiliSearch 之前,我想先聊下我是怎么找到它并喜欢上它的。

我的要求并不高

我开发的 HelloGitHub 小程序:支持关键字搜索往期月刊中的开源项目。

小程序的搜索功能是用 Rust 写的开源搜索引擎 Sonic,它虽然搜索速度快但使用过程中发现:

  • 不支持中文分词,导致搜索结果较差
  • 没有官方的 Python 客户端,三方开源客户端问题较多
  • 搜索返回的结果仅有 ID,需要再去数据库关联其他数据

这些问题直接影响了搜索的体验,让我十分苦恼一边看搜索相关的知识,另外也在寻找新的开源解决方案。想找一个:

部署+配置简单、支持中文分词、搜索速度快、轻量级开源搜索引擎项目。

俗称:傻瓜中文搜索引擎。

它有个美丽的名字

它有个“美丽”(meili)的名字「MeiliSearch」,同样是用 Rust 写的开源搜索引擎,支持:

概述功能:搜索速度快、全文搜索、支持汉字、容易安装和维护,这不就是我在找的:傻瓜中文搜索引擎吗?

我已经摩拳擦掌的跃跃欲试了,话不多说搞起!

简单的开始

纸上得来终觉浅,得上手试试效果。

1、安装和启动

Linux & Mac OS 的一键安装和启动的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -L https://install.meilisearch.com | sh
./meilisearch

这个安装够不够傻瓜🤪 启动成功如下图:

用浏览器访问:http://127.0.0.1:7700/ 就可以看到 MeiliSearch 提供的 Web 搜索页面。我提前写入了一些数据,用来演示搜索:

2、基本操作

MeiliSearch 就是一个搜索的服务,提供 RESTful API 通讯协议更加通用,官方提供了多种编程语言的客户端:

  • JavaScript
  • Python
  • PHP
  • Go
  • ...

后面的演示将采用 Python 代码作为示例,安装 Python SDK

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 要求 Python3.6+
pip3/pip install meilisearch

用 Python 实现连接、写入、查询、删除等基本操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import meilisearch

client = meilisearch.Client('http://127.0.0.1:7700', 'masterKey') # masterKey 是密码

# index 相当于数据库的表
index = client.index('books')

# 准备写入搜索的数据
documents = [
  { 'book_id': 123,  'title': 'Pride and Prejudice' },
  { 'book_id': 456,  'title': 'Le Petit Prince' },
  { 'book_id': 1,    'title': 'Alice In Wonderland' },
  { 'book_id': 1344, 'title': 'The Hobbit' },
  { 'book_id': 4,    'title': 'Harry Potter and the Half-Blood Prince' },
  { 'book_id': 42,   'title': 'The Hitchhiker\'s Guide to the Galaxy' }
]
# 删:清空指定 index
index.delete_all_documents()

# 写:
result = index.add_documents(documents) 
# 该引擎会根据写入数据 ID 做替换或者新增的操作
# 写入后并不代表搜索引擎处理完成,可以查看返回 updateId 的状态
index.get_update_status(result.get('updateId'))
# enqueued, processed or failed 三种状态(processed 代表完成)

# 查:
index.search('harry pottre')
# 结果:
# 包含丰富的字段
"""
{
  // 命中的结果
  "hits" => [{
    "book_id" => 4,
    "title" => "Harry Potter and the Half-Blood Prince"
  }],
  // 页
  "offset" => 0,
  // 每页条数
  "limit" => 20,
  // 处理耗时
  "processingTimeMs" => 1,
  // 查询的内容
  "query" => "harry pottre"
}
"""

至此已经实现了搜索的最基本的功能,但探索不止于此。

3、优化搜索效果

MeiliSearch 可通过配置规则来提高搜索结果:

  • synonyms:同义词
  • stopWords:停用词(为节省存储空间和提高搜索效率,自动过滤掉某些字或词)
  • rankingRules:排序规则
  • ...

可以用 Python 客户端更新 MeiliSearch 配置,示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 停用词
client.index('movies').update_settings({
  'stopWords': [
      'the',
      'a',
      'an'
  ],
})
# 排序规则
client.index('movies').update_ranking_rules([
    "typo",
    "words",
    "proximity",
    "attribute",
    "wordsPosition",
    "exactness",
    "asc(publish_time)",
    "desc(watch)"
])
# 查看 stop words
client.index('movies').get_stop_words()
# 重置设置
# index.reset_settings()
# 除了搜索其它操作都是异步,会直接返回一个 updateId 需要通过 ID 查询处理状态
# wait_for_pending_update 可阻塞等待处理结果

这些设置可以有效的提高搜索效果,比如使用停用词之前,搜索“开源的书籍”命中不了“开源书籍”,加了停用词即可命中,因为匹配时忽略了输入内容包含的停用词(无用词)。

说一个我遇到的坑,我测试搜索效果时发现:go 搜不到,但是 golang 就可以搜索到,排查了半天最后发现是因为 go 在上面的停用词字典中😅

另外,功能上对比 sonic 没有词联想(suggest),可以通过新建 index+searchableAttributes 实现。

同义词集合我没有找到,如果大家有现成的 中/英文 同义词词典,欢迎留言告诉我~感谢

4、部署

MeiliSearch 部署很简单,增加到系统的 systemd 服务就行了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat << EOF > /etc/systemd/system/meilisearch.service
[Unit]
Description=MeiliSearch
After=systemd-user-sessions.service

[Service]
Type=simple
ExecStart=/usr/bin/meilisearch --http-addr 127.0.0.1:7700 --env production --master-key xxxxxx

[Install]
WantedBy=default.target
EOF

# Set the service meilisearch
systemctl enable meilisearch

# Start the meilisearch service
systemctl start meilisearch

# Verify that the service is actually running
systemctl status meilisearch

但部署正式环境,需要注意以下几点:

  1. 生产环境必须设置密码,开发环境无强制
  2. 生产环境 Web 页面会关闭
  3. 没有远程访问和权限控制,可以通过 Nginx 实现 IP 白名单+ Cerbot 实现 HTTPS,提高安全性
  4. 可通过 curl 地址 查看服务状态

以上就是我使用 MeiliSearch 的一些心得,总体给我的感觉:

  • 安装简单,没有复杂的配置:省心
  • 数据写入方便,功能丰富:傻瓜
  • 查询快

一条命令即可启动搜索服务,一行代码实现搜索功能,有了它我这个搜索小白都能分分钟实现一个搜索服务,舒服~

爱的结晶(实战)

我用 MeiliSearch 重写了 HelloGitHub 小程序的搜索功能,后端用的 FastAPI 框架。除此之外还增加了一些新功能:

  1. 热门搜索词
  2. 项目详情页
  3. 项目镜像地址提高访问速度
  4. 新的界面

HelloGitHub 小程序第二版效果图如下:

👆点击使用👆

后面计划增加:信息流、评论、打分、用户系统、积分系统,因为只有我一个人开发,所以进度会很慢...但我不会半途而废哒 💪

最后

如果说 MeiliSearch 缺点的话,我觉得搜索准确度还有待提高,一方面我需要学习下分词和 NLP 的一些知识,另一方面需要再熟悉下它的 API 和原理,然后再找一些词典辅助,应该能提高准确度,但心急吃不了热豆腐慢慢来吧。

最后,希望本文的分享有帮助到你,今天的文章就到这里了。如果你也想分享把玩开源项目的心得,欢迎投稿原创文章给我,微信:xueweihan(备注:投稿)

优秀的开源项目像散落在海边的贝壳,需要发现它的人。 HelloGitHub 就是拾贝者,找开源项目来 HelloGitHub 就对了!

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HelloGitHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MeiliSearch轻量级搜索引擎-食用指南
MeiliSearch 是一个开源、速度极快且高度相关的搜索引擎。但它不仅仅是通用搜索引擎:MeiliSearch 高度可定制的搜索引擎 API 为您提供了极大的灵活性。例如,您可以修改排名规则、添加自定义排名规则、配置同义词、过滤掉停用词等等。为了提高您的搜索能力,MeiliSearch 允许您设置作为索引的分面过滤器。
爱吃大橘
2022/12/27
3.8K0
实时通信 | 轻量级搜索引擎MeiliSearch
MeiliSearch是一个功能强大,快速,开源,易于使用和部署的搜索引擎。搜索和索引都是高度可定制的。允许输入、过滤器和同义词等特性都是开箱即用的。是近两年开源的项目,同样也支持中文分词,在小数据规模下可以实现比ElasticSearch更加快速和易用的搜索体验。
Tinywan
2023/03/08
2.6K0
实时通信 | 轻量级搜索引擎MeiliSearch
【ES三周年】轻量级的搜索引擎MeiliSearch
谈到搜索引擎,可能大家最先想到的是Elasicsearch。Elasticsearch是一个分布式、高扩展、高实时的搜索与数据分析引擎,能够在大量的数据中搜索、分析和探索需要的数据。在后端架构中,Elasticsearch通常需要与Logstash的数据收集和日志解析引擎Kibana一起配合来搭建可视化平台,而这三个产品也被设计成一个集成解决方案,称为ELK。
xiangzhihong
2022/11/14
7.1K0
【ES三周年】轻量级的搜索引擎MeiliSearch
使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐
这篇文章,我们继续聊聊,如何折腾 AI 应用,把不 AI 的东西,“AI 起来”。在不折腾复杂的检索系统的前提下,快速完成轻量的 RAG 实践。
soulteary
2024/05/20
9630
使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐
这篇文章,我们继续聊聊,如何折腾 AI 应用,把不 AI 的东西,“AI 起来”。在不折腾复杂的检索系统的前提下,快速完成轻量的 RAG 实践。
soulteary
2024/05/29
1.3K0
使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐
Go项目优化——使用Elasticsearch搜索引擎
本文为通过实例(图书项目)来学习go中Elasticsearch的使用,以及对项目带来的性能的提升
传说之下的花儿
2023/04/16
5100
Go项目优化——使用Elasticsearch搜索引擎
搜索引擎原理解析:从0开始实现一个搜索引擎
打开谷歌, 输入关键词, 谷歌往往可以很精准的返回你所需要的内容, 这个是怎么实现的呢?简单的思考一下就能得出一个结论:一定是关键词能极为快速和准确的命中具体的内容及地址, 但是搜索引擎的收录页面数量往往是千亿万亿级别的,从这个量级里面检索到你要的数据可以说是大海捞针一点也不夸张。那么搜索引擎是如何让你在数据的汪洋大海里捞到你想要的那根针的那?这就要说到所有的搜索引擎都离不开一个概念: 索引。
政采云前端团队
2023/12/19
1.3K0
搜索引擎原理解析:从0开始实现一个搜索引擎
070. 搜索引擎理论简述
1. 索引 ---- 1. 索引的原理是什么? 对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找(或者其他方式)快速找到要查找的行的地址,再根据地址直接取行数据。 2. 为什么称为倒排索引? 英文原名为 Inverted index,失败地被翻译成了倒排索引。 应该翻译为:反向索引。 3. 反向索引的记录数会不会很大? 英文单词的大致数量是10万个。 汉字的总数已经超过了8万,而常用的只有3500字。 《现代汉语规范词典》比《现代汉语词典》收录的字和词数量更多。前者是130
山海散人
2021/03/03
4830
《HelloGitHub》第 95 期
这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短时间内感受到开源的魅力,对编程产生兴趣!
HelloGitHub
2024/02/29
3080
《HelloGitHub》第 95 期
javaScript中的搜索引擎:Elasticsearch与Solr
在现代Web应用中,搜索引擎是提升用户体验、优化信息检索的关键技术。在JavaScript开发领域的话,Elasticsearch和Solr是两款广受欢迎的搜索引擎。
iwhao
2024/07/07
2590
搜索引擎是如何工作的?
搜索引擎匹配查询到它们创建的索引上。这个索引包含每个文档的单词,和能指向文儿当地址的指针。这被叫做倒排索引文件【 inverted file】。一个搜索引擎或者IR系统包括四个基本的模块:
程序猿DD
2020/07/15
1.1K0
手把手教你实现文档搜索引擎
搜索引擎的核心功能是帮助用户再海量的信息中快速、准确的找到所需的内容。 要实现这样的目标,搜索引擎需要具备以下技术:
Yui_
2025/02/23
1350
手把手教你实现文档搜索引擎
【搜索引擎:Elasticsearch】从0了解ES,整合springboot,京东搜索实战
SQL : like %冷环渊% 但是数据量一旦变大了,就会变慢,这个时候用索引, 也是只能快一些
冷环渊
2022/04/17
1.2K0
【搜索引擎:Elasticsearch】从0了解ES,整合springboot,京东搜索实战
搜索引擎架构概述
架构 对软件系统来讲,从一个层面对系统的各个组件进行抽象.描述它们各自的功能、提供的接口以及它们之间的关系. 需求 架构为应付需求而产生,对搜索引擎来讲,它主要的需求来自两个方面: 效果(effectiveness):搜索的结果质量如何. 效率(effeciency):返回结果的相应时间是不是够低,搜索服务的吞吐量是不是够高. 索引处理系统(Indexing Process) 从这样的需求出发,我们就不能顺着文档的每一个字或词来比较用户输入的查询关键字. 所以我们需要一种能提供高效的数据结构、算法和检索
用户1263954
2018/01/30
1.7K0
搜索引擎架构概述
Redis Stack 技术栈之搜索引擎 RedisSearch
RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完成、分面搜索和排序。利用 Redis 的高性能特点,RedisSearch 可以实现高效的搜索和实时分析。对于微服务架构来说,RedisSearch 可以作为搜索服务的一部分,提供快速、高效的搜索能力,对于提高用户体验和性能具有重要的意义。
Tinywan
2023/12/26
1.3K0
Redis Stack 技术栈之搜索引擎 RedisSearch
技术干货 | 搜索引擎之倒排索引解读
互联网时代,信息纷繁海量,人们通过搜索引擎直达“心中所想”已是常态。那么搜索引擎到底是如何高效查找目标内容呢?本文主要介绍搜索引擎里一个比较重要的结构——倒排索引。 1 倒排索引简介 倒排索引(英文:Inverted Index),是一种索引方法,常被用于全文检索系统中的一种单词文档映射结构。现代搜索引擎绝大多数的索引都是基于倒排索引来进行构建的,这源于在实际应用当中,用户在使用搜索引擎查找信息时往往只输入信息中的某个属性关键字,如一些用户不记得歌名,会输入歌词来查找歌名;输入某个节目内容片段来查找该
达观数据
2018/03/30
2K0
技术干货 | 搜索引擎之倒排索引解读
那些年的开源项目,你跑起来了吗?
就这样我靠着这份代码顺利毕业,和兄弟们互道一句:“分头打钱,有事儿TP!”,独自踏上了程序员之路。
HelloGitHub
2021/12/09
1.4K0
那些年的开源项目,你跑起来了吗?
【文心索引】搜索引擎测试报告
随着互联网技术的飞速发展,全球范围内的信息量呈现出爆炸式增长。网络已成为人们获取信息的主要渠道,每天有海量的网页被创建和更新,涵盖了新闻、学术、商业、娱乐等各个领域。然而,面对如此庞大的信息海洋,用户如何高效、准确地找到所需信息成为了一个巨大的挑战。
用户11316056
2025/03/08
1400
【文心索引】搜索引擎测试报告
搜索引擎核心技术初探——倒排索引
数字化时代,搜索引擎已经成为我们日常生活中不可或缺的一部分,为我们提供了一个迅速而便捷的途径。 搜索引擎利用复杂的算法来实现高效的搜索,其中一个关键的技术却是倒排索引。 这个看似普通的数据结构却是搜索引擎背后的核心,负责快速、有效地定位相关信息。
windealli
2023/11/15
1.7K0
搜索引擎核心技术初探——倒排索引
多功能搜索引擎,50ms 内展现结果! | 开源日报 No.155
meilisearch 是一个快速的搜索 API,可以轻松地集成到您的应用程序、网站和工作流程中。
小柒
2024/01/16
3320
多功能搜索引擎,50ms 内展现结果! | 开源日报 No.155
推荐阅读
相关推荐
MeiliSearch轻量级搜索引擎-食用指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验