ES代替品:轻量级搜索引擎MeiliSearch
痛点
虽然Elasticsearch足够灵活强大、扩展性和实时性也较好。但是对于中小型项目来说,Elasticsearch还是显得有些庞大,对硬件设备的要求也较高。那么,在要求不是很高的情况下,我们可以考虑另一种搜索引擎方案:MeiliSearch。
MeiliSearch是一个功能强大、快速、开源、易于使用和部署的搜索引擎,并且MeiliSearch的搜索和索引都是高度可定制的,提供开箱即用的功能属性,如错字容忍、过滤器和同义词。而最重要的一点是,它【支持中文搜索】,而不需要添加额外的配置。
特性
它具有以下特点:
- 快速: MeiliSearch旨在提供快速的搜索速度。使用MeiliSearch,用户可以在毫秒级别内获取查询结果,即使在大数据集上也是如此。
- 精度高: MeiliSearch采用先进的算法来确保搜索结果的准确性。它支持拼写修正、同义词替换、近义词搜索等功能,这些功能可以大大提高搜索结果的质量。
- 可定制性强: MeiliSearch具有灵活的API,可以轻松集成到任何应用程序中。它还支持自定义排名、字段权重和搜索范围等功能。
- 易于使用: MeiliSearch的安装和设置过程非常简单,并且它提供了易于使用的Web界面和CLI工具,使用户可以轻松管理和监控搜索引擎。
快速
在官方网站上提供了一些性能比较数据和基准测试结果,这些测试结果显示MeiliSearch在处理大型数据集时速度非常快,可以在毫秒级别内返回查询结果。
例如,在官方提供的基准测试中,使用MeiliSearch
处理10
万个文档时,平均搜索时间为1.47
毫秒,而使用Elasticsearch
搜索同样的数据集时,平均搜索时间为44.1
毫秒。这表明,MeiliSearch
在速度方面比其他一些搜索引擎更快,并且可以在大规模数据集上实现高效搜索。
高精度搜索
MeiliSearch的第二个特点是高精度搜索。为了实现这个特点,MeiliSearch使用了多种算法和技术,包括:
- 拼写纠正:当用户拼写单词错误时,MeiliSearch可以自动检测并纠正拼写错误,从而提供更准确的搜索结果。
- 同义词替换:MeiliSearch支持同义词替换,当用户输入一个词时,搜索引擎会将其替换为相关的同义词,从而扩展搜索范围并提供更准确的搜索结果。
- 近义词搜索:MeiliSearch还支持近义词搜索,当用户输入一个词时,搜索引擎会在索引中查找相关的近义词,并将它们包含在搜索结果中。
除了上述功能,MeiliSearch还支持模糊搜索、停用词过滤、基于短语和前缀的搜索等多种功能,这些功能可以大大提高搜索结果的质量和准确性。总之,MeiliSearch通过多种算法和技术来提高搜索结果的准确性和质量,使其成为一种高精度的搜索引擎。
可定制性强
MeiliSearch的第三个特点是可定制性强。它提供了灵活的API,使开发人员可以根据自己的需求自定义搜索引擎的各种功能和特性,包括:
- 自定义排名:开发人员可以根据自己的需求自定义搜索结果的排名方式,以确保最相关的结果在搜索结果列表中排名靠前。
- 字段权重:开发人员可以指定搜索引擎在搜索过程中应该优先考虑哪些字段,以提高搜索结果的准确性。
- 搜索范围:开发人员可以限制搜索的范围,例如只搜索特定的字段或文档类型,以提高搜索结果的质量。
以下是一些示例:
假设我们有一个在线书店,我们想要实现一种搜索功能,可以搜索书名、作者、出版社等字段,并且希望搜索结果按照出版日期的先后顺序排列。我们可以使用MeiliSearch的API来实现这个功能,例如:
import io.github.crew102.meilisearchjava.Client;
import io.github.crew102.meilisearchjava.Index;public class MeiliSearchDemo {public static void main(String[] args) {// Create a MeiliSearch client objectClient client = new Client("http://localhost:7700", "masterKey");// Get an indexIndex index = client.getIndex("books");// Define search parametersSearchParams params = new SearchParams().setSort(Collections.singletonList("published_date")).setAttributesToHighlight(Arrays.asList("title", "author", "publisher")).setAttributesToRetrieve(Arrays.asList("title", "author", "publisher", "published_date"));// Perform searchSearchResults<Book> results = index.search("Harry Potter", Book.class, params);// Print search resultsfor (SearchResult<Book> hit : results.getHits()) {Book book = hit.getResult();System.out.println(book.getTitle() + " by " + book.getAuthor() + " published by " + book.getPublisher() + " on " + book.getPublishedDate());}}
}
在上面的示例中,我们首先创建了一个MeiliSearch客户端对象,然后定义了一些搜索参数,例如按照出版日期排序、高亮显示标题、作者和出版商等。接下来,我们使用MeiliSearch的search方法来执行搜索,并遍历搜索结果以打印出书名、作者、出版社和出版日期等信息。
支持多语言搜索
MeiliSearch的第五个特点是支持多语言搜索。这意味着MeiliSearch能够搜索多种语言的文本,并且可以正确处理每种语言的语法和语义。这种功能对于需要支持全球用户的应用程序非常有用,例如国际化的电子商务平台、跨语言的新闻网站等。
MeiliSearch支持的语言非常多,包括但不限于英语、中文、日语、韩语、法语、德语、西班牙语、意大利语、荷兰语、葡萄牙语、俄语、阿拉伯语、希伯来语等等。MeiliSearch能够支持如此多种语言的搜索,主要得益于其内置的各种语言处理工具,例如分词器、词干提取器、同义词扩展器、语义分析器等等。
部署安装
环境:ubuntu
部署方式:Docker
编排工具:DockerCompose
配置信息:
version: '3'services:meilisearch:image: getmeili/meilisearch:latestcontainer_name: meilisearchrestart: alwaysenvironment:MEILI_HTTP_ADDR: 0.0.0.0:7700# MEILI_MASTER_KEY: meilisearchmasterkeyports:- 7700:7700volumes:- meilisearch_data:/data.msvolumes:meilisearch_data:
- 执行安装命令
docker-compose -f meilisearch_compose.yaml stop docker-compose
- 下载测试数据
测试数据地址:https://docs.meilisearch.com/movies.json
- 导入测试数据
curl -X POST 'http://localhost:7700/indexes/movies/documents?primaryKey=id' -H 'Content-Type: application/json' --data-binary @movies.json
总结
总的来说,对于数据量不是很大的中小型企业来说(几百万到几千万的数据),都可以使用 MeiliSearch 搜索引擎。同时,它的使用场景基本可以覆盖当前主流的平台和技术,如管理后台搜索、小程序搜索等场景中。是一款真正轻量级安装部署、搜索速度快到极致,名副其实的轻量级且美丽搜索引擎
相关文章:
ES代替品:轻量级搜索引擎MeiliSearch
痛点 虽然Elasticsearch足够灵活强大、扩展性和实时性也较好。但是对于中小型项目来说,Elasticsearch还是显得有些庞大,对硬件设备的要求也较高。那么,在要求不是很高的情况下,我们可以考虑另一种搜索引擎方案:MeiliSe…...
用C语言打造自己的Unix风格ls命令
在Unix或类Unix操作系统中,ls是一个非常基础且实用的命令,它用于列出当前目录或指定目录下的文件和子目录。下面,我们将通过C语言编写一个简化的ls命令,展示如何利用dirent.h头文件提供的函数接口实现这一功能。 #include "…...
git的起源
开篇一张图: 开源项目linux kernel开发,参与开发与维护者众多。1991至2005年期间绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上。 在2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维…...
软件杯 深度学习 python opencv 火焰检测识别
文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…...
C# double类型计算精度问题解决
问题:res 的值0.112450000001,精度不对,预期是0.11245 double force112.45; double res force / Math.Pow(10, index * 3); double force112.45; double res force / Math.Pow(10, index * 3); string str res.ToString(&qu…...
基于Springcloud+Vue校园招聘系统 Eureka分布式微服务
以行动研究为主,辅以文献法、教育实验法和个案研究法等方法相结合的研究方法。在研究方法,遵循软件工程中软件生命周期的规则。概括来讲可以划分成三大步:系统规划、系统开发和系统运行维护。将其上述步骤细分下来,可以分为以下8小…...
【NLP笔记】RNN总结
文章目录 经典RNN单向RNN双向RNNDeep RNNRNN特性总结 变体RNNLSTMGRU 参考及转载内容: 循环神经网络(RNN)深度学习05-RNN循环神经网络完全理解RNN(循环神经网络) 传统的CNN(Covolutional Neural Network&am…...
[c++]内存管理
1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1; int num1[10] { 1, 2, 3, 4 }; char char2[] "abcd"; const char* pChar3 "abcd"; …...
k8s通过编排文件,实现服务的滚动更新
k8s通过编排文件,实现服务的滚动更新 apiVersion: apps/v1 kind: pod metadata:name: ‘servicename’labels:app: ‘servicename’ spec:replicas: 4 ##pod启动数量最少为2,不然滚动更新无意义strategy:type: RollingUpdate ##设置类型为滚动更新以及…...
安卓面试题多线程 96-100
96. 简述notify()和notifyAll()有什么区别 ?notify可能会导致死锁,而notifyAll则不会任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码 使用notifyall,可以唤醒 所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一…...
第二十六章 配置 Web Gateway 的默认参数
文章目录 第二十六章 配置 Web Gateway 的默认参数网络网关实例主机名最大连接数最大缓存大小网络服务器 ID Cookie 第二十六章 配置 Web Gateway 的默认参数 本页介绍如何通过 Web Gateway 管理页面配置 IRIS Web Gateway 的默认参数。其他文章介绍了如何配置服务器和应用程序…...
npm i安装依赖报错,但是cnpm i 却安装成功
问题描述:在a项目中npm i 安装依赖时发生以上报错,但是cnpm i 却成功,而且在其他项目中npm i 安装其他项目依赖也能成功.... 解决办法:删除项目中package-lock.json文件后再npm i 即可...
C语言经典算法-9
文章目录 其他经典例题跳转链接46.稀疏矩阵47.多维矩阵转一维矩阵48.上三角、下三角、对称矩阵49.奇数魔方阵50.4N 魔方阵51.2(2N1) 魔方阵 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠走迷官(一)6.…...
React 19的变化
并发模式(非实验): React 的并发模式终于从实验阶段毕业了。这一改变游戏规则的功能允许 React 应用程序同时准备多个版本的 UI。有着更平滑的过渡和更灵敏的用户体验,因为 React 现在可以处理高优先级更新,同时保持应用程序的交互…...
Kafka整理-Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)的区别是什么?
Apache Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)虽然都是处理消息和数据流的中间件,但它们在设计理念、架构、功能和使用场景方面有显著的区别。下面是Kafka与传统消息队列系统的主要区别: 1. 设计目的和使用场景 Kafka: 设计初衷是为处理大量的实时数据流。强调高…...
汽车电子零部件(8):T_Box
前言: 网联汽车(Connected Vehicles ,CV)是一个广泛的概念,四个主要的CV线程已发展起来:互联、自主、共享和电动。这些应用于包括CV在内的垂直领域:汽车、通信、互联网和共享手机服务。中国汽车工程师学会(SAEC)提倡将车载ADAS(高级驾驶员辅助系统)与通信技术相结合…...
数库据设计最佳实践
中老年程序员,从业生涯设计过很多数据库,有用上的也有没用上的,有精心设计花无数心思更改了无数次的也有敷衍了事能用就行的,有最糟糕的设计也有感觉还不错的。在设计和修改过程中有很多疑问和感悟,在此记录一下以方便…...
ESSBAE 数据挖掘
essbase数据挖掘框架 1.算法:用来分析数据的方法 2.模型:系列的算法集合 3.任务:数据挖掘的步骤 4.任务模板,可以重复执行的任务 数据挖掘任务: 明确任务 建立及训练模型 测试模型 执行任务 为模型打分 ess…...
在Linux/Ubuntu/Debian中使用iFuse访问iOS 设备(例如 iPhone 或 iPad)上的文件可双向复制粘贴
iFuse 是一款工具,可让你在 Linux 系统上安装 iOS 设备(例如 iPhone 或 iPad),使你能够访问其文件系统并与设备传输文件。 以下是有关如何使用 iFuse 的基本指南: 安装依赖项:在安装 iFuse 之前,…...
驱动开发中的DMA是什么
DMA是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。 使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来, 从而大大提高系统的吞吐率。 DMA通常与硬件体系结构, 特别是外设的总线技术密切相关。 DMA方式的数据传输由DM…...
websocket 升级协议时的协议切换点
websocket 的 rfc6455 标准中提到了协议升级,从http协议升级到websocket协议,用的办法是在http的request header中包含Connection: upgrade 和 Upgrade: websocket 以及其他验证相关的头。服务器验证通过后发送 respond,并升级到websocket。但…...
在Linux中开发C++
在Linux中开发C 本文档为本人在学习慕课网课程——[重学C ,重构你的C知识体系]时的一些记录与思考,侵删。学习课程请支持正版! 1. 搭建C/C编译环境 1.1 gcc 和 g 的区别 本质上没有太大区别,gcc 默认使用 c 编译器…...
【linux】Debian访问Debian上的共享目录
要在Debian系统上访问共享目录,通常意味着要访问通过网络共享的文件夹,比如通过SMB/CIFS(Server Message Block/Common Internet File System)协议共享的Windows共享文件夹。以下是访问共享目录的步骤: 1. 安装必要的…...
Postman Newman API 自动化测试快速入门
什么是 Newman? Newman 是一款专为 Postman 打造的命令行工具,旨在通过自动运行 Postman 集合和环境,实现 API 测试的自动化。它使得开发者无需打开 Postman 图形界面,即可直接在命令行中执行测试用例。 Newman 的优势 使用 Ne…...
Python之Web开发中级教程----ubuntu安装MySQL
Python之Web开发中级教程----ubuntu安装MySQL 进入/opt目录 cd /opt 更新软件源 sudo apt-get upgrade sudo apt-get update 3、安装Mysql server sudo apt-get install mysql-server 4、启动Mysql service mysql start 5、确认Mysql的状态 service mysql status 6、安全设…...
Flutter开发入门——路由
什么是路由? 移动端应用开发中,路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中,一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…...
Acrobat Pro DC 2023:PDF编辑与管理的全新体验
Acrobat Pro DC 2023是一款功能强大且全面的PDF编辑和管理软件,旨在为用户提供卓越的PDF处理体验。以下是关于Acrobat Pro DC 2023软件功能特色的详细介绍: PDF编辑和管理:Acrobat Pro DC 2023拥有强大的PDF编辑功能,可以对PDF文…...
Linux课程_____网络管理
一、查看接口信息 1. ifconfig 查看所有活动网络接口的信息 ifconfig -a 查看所有网络接口信息 ifconfig 直接加网络接口 查看指定网络接口信息 1.1查看指定接口IP [rootlocalhost ~]# ip addr show ens160 1.2设置网络接口的IP地址 # ifconfig eth0 192.168.152.133 …...
ubuntu20.04_PX4_1.13
说在前面:(最好找一个干净的Ubuntu系统)如果配置环境的过程中出现很多编译的错误或者依赖冲突,还是建议新建一个虚拟机,或者重装Ubuntu系统,这样会避免很多麻烦💐 , 安装PX4 1.13.2 …...
12350安全生产举报热线系统解决方案
一、建设背景 1. 安全生产的重要性 在当今社会,安全生产是企业和社会发展中至关重要的一环。随着工业化的推进和技术的不断创新,各种生产活动中潜在的安全隐患也随之增加。为了及时发现和解决这些问题,各省市纷纷设立了安全生产举报热线。在…...
做网站怎么申请百度推广/公司网址有哪些
第90讲:基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验akka在业界使用非常广泛spark背后就是由akka驱动的要写消息驱动的编程模型都首推akka下面将用30讲讲解akka本讲主要讲两部分内容:1.akka的重大意义2.akka与scala的actorSpark源码中使用ak…...
海口网站建设方案/广告竞价排名
实现效果 前端代码: <!--v-model 实现双向数据绑定 绑定变量selectModel change绑定changeModel($event)方法,为模型改变触发的函数--> <select idmodel v-model"selectModel" style"width:100px" change"changeMod…...
赣州有做网站推广的公司吗/培训方案怎么做
消息队列基本函数用法 msgget if((msgid **msgget**(IPC_PRIVATE,0666)) -1) msgget(IPC_PRIVATE,0666)说明:IPC_PRIVATE key值,建立新的消息队列。0666 msgflag 返回值:-1 创建失败 发送的信息 用户需自定义缓冲区:定义成结…...
拓者设计吧邀请码/长春网站优化流程
图片来源:https://yq.aliyun.com/articles/61960?utm_campaignwenzhang&utm_mediumarticle&utm_sourceQQ-qun&utm_contentm_10571 转载于:https://www.cnblogs.com/xiaolovewei/p/9061398.html...
政府网站建设管理工作情况汇报/网页制作源代码
我试图在我的情节的左右两边加上填充。但是当我改变xlim和ylim时,图像变小了。我做错什么了?import matplotlib.pyplot as pltplt.rcParams[text.usetex] Falsefrom matplotlib.font_manager import FontPropertiesimport seaborn as sns%matplotlib in…...
asp做网站上传文件系统/海外广告投放公司
在使用百度富文本编辑器上传图片的过程中,如果是有一台单独的图片服务器就需要将上传的图片放到图片服务器,比如在a.com的编辑器中上传图片,图片要保存到img.com,这就涉及到跨域上传图片,而在ueditor官方文档中说不支持单图上传的跨域,网上查了一下各种花里胡哨,一顿操作猛如虎…...