YiluPHP
这家伙很懒,什么都没有留下...

经验 内存太小运行不了ES和solr?介绍几款全文搜索的软件给你

浏览数 13783 最后修改时间

最近花99元买了一台云服务器,2核2G内存,想做一个内容展示的网站,最多只会有几千或几万篇文章和其它内容,所以这样的服务器配置是足以支撑的。但是为了更好的体贴,希望能全文搜索,并且支持中文分词搜索。当我安装好Elasticsearch,启动Elasticsearch时直接服务器就卡死了,做不了任何操作,卡了一个晚上也动弹不得,只能提工单协助解决。

其实我在本地使用虚拟机(也是2核2G内存)是能跑Elasticsearch的,应该是云服务器的性能更差,所以一启动就卡死,再说99元/年的云服务器,也不能有太高的期望。

对这种重型搜索软件的尝试以失败而告终了,只能尝试轻便又能达到相同效果的搜索软件了,以下我介绍7款支持全文搜索的软件,其中我选择和安装的就是Meilisearch。

1. Elasticsearch

官网:https://www.elastic.co/cn/

虽然 Elasticsearch 是最流行的搜索引擎之一,提供强大的全文搜索能力和复杂查询功能,但它对资源的需求相对较高。

内存:Elasticsearch 对内存有最小要求。对于开发和测试环境,通常需要至少 2 GB 的内存。对于生产环境,至少需要 4 GB 或更多,以确保 Elasticsearch 能够有效运行。

2. Apache Solr

官网:https://solr.apache.org

Apache Solr 与 Elasticsearch 类似,功能强大,但同样在较小的内存配置下可能会受限。Solr 的配置和管理可能稍显复杂,但它提供了丰富的文档处理和查询功能。对于内存较小的情况,合理配置 JVM 设置和缓存是必需的。

3. Typesense

官网:https://typesense.org

Typesense 是一个轻量级、实时的全文搜索引擎,设计上追求简单和速度。它的内存和CPU使用效率较高,适合在资源受限的环境中使用。Typesense 提供了简单易用的API和自动处理多种类型的搜索优化,是一个在小型机器上运行的不错选择。

Typesense 是设计为内存内搜索引擎,其性能高度依赖于将索引保持在内存中。对于较小的数据集,Typesense 的内存需求并不高。

最小内存: Typesense 在处理小型数据集时,最小可运行在 256MB RAM 的环境中。但为了保证流畅运行和处理峰值负载,建议至少提供 1GB 的内存。

4. MeiliSearch

官网:https://www.meilisearch.com

MeiliSearch 是一个开源、轻量级的搜索引擎,专为简易性和速度设计,特别适合小到中等规模的项目。它非常易于安装和使用,对资源的要求也比 Elasticsearch 和 Solr 小,可以在较低配置的服务器上提供良好的搜索体验。

MeiliSearch 也是设计用于高效全文搜索的轻量级搜索引擎。它优化了索引过程以减少内存使用,适用于小到中等规模的数据集。

最小内存:MeiliSearch 的官方文档建议至少有 2GB 的内存,以保证基本的操作性能。不过,对于非常小的数据集,它可以在小于 1GB 的内存中运行,但这样可能会影响其性能和数据处理能力。

官方安装文档:
https://www.meilisearch.com/docs/learn/getting_started/installation

对搜索结果排序的文档:
https://www.meilisearch.com/docs/learn/fine_tuning_results/sorting

快速开始文档:
https://www.meilisearch.com/docs/learn/getting_started/quick_start

官方提供了多种安装方式


甚至可以下载一个编译好的二进制文件,下载后直接运行,我使用的就是这种方式。


下载好之后存放在你想存放的目录里,注意默认情况下缓存数据的文件是在同一目录下,所以最好专门为Meilisearch创建一个目录。在启动Meilisearch时,可以通过参数做各种配置,可以在参考官方文档找到各种配置项,你也可以问大语言模型,如ChatGPT、Kimi、豆包、文心一言、通义千问等等,大语言模型能解决很多技术问题。

./meilisearch --http-addr '0.0.0.0:7700' --master-key='yiluphp2017'

以上命令中meilisearch是文件名,就是下载的二进制文件。
--http-addr '0.0.0.0:7700' 是允许任何IP访问(默认只允许从本机访问),并且开放的端口号是7700。
--master-key='yiluphp2017' 设置了一个密码:yiluphp2017,默认是不需要密码的。

启动成功后是长这样子的:

官方提供了各大语言的SDK和实例,使用起来非常方便:


5. Sphinx

官网:http://sphinxsearch.com

Sphinx是一个灵活且高效的搜索工具,特别适合于中到小规模的数据集。几百MB的内存就足以支持基本的查询和索引需求,对于小规模项目,建议配置至少1GB的内存给Sphinx,这样可以有足够的缓冲区来处理索引操作和查询处理,尤其是在并发请求或数据更新时。

查询缓存:Sphinx使用查询缓存来加速搜索响应时间。缓存大小可配置,对内存的影响可以根据实际需求调整。

实时索引与非实时索引:

非实时索引(Disk-Based Indexes)通常需要较少的内存,因为它们主要存储在磁盘上,内存中仅加载必要的数据。

实时索引(Real-Time Indexes)则在内存中维护,因此会消耗更多内存。

6. SQLite FTS

如果你的数据量不是非常大,可以考虑使用 SQLite 的全文搜索扩展(FTS)。SQLite 是一个轻量级的数据库,不需要运行一个单独的服务进程,而是作为应用的一部分运行,对资源的消耗极小。它的全文搜索扩展可以支持基本的全文检索功能,非常适合小型应用或初期产品。

SQLite 的全文搜索模块 (FTS) 是非常轻量级的,适合嵌入式系统和小型应用。它直接在 SQLite 数据库文件上操作,不需要额外的内存来维持独立的搜索索引。

最小内存: SQLite FTS 的内存需求主要依赖于数据库操作本身,而不是全文搜索功能。在非常受限的环境下(如几十MB的内存),SQLite 仍然可以高效运行。

SQLite 的全文搜索(FTS)模块可以实现分词搜索。SQLite FTS通过创建虚拟表,提供了强大的文本搜索能力,能够进行词汇级的索引和查询,这包括对分词后的文本进行搜索。

SQLite 的全文搜索对中文支持有限,因为中文不使用空格分隔单词。

7. MySQL

MySQL 提供了全文搜索功能,类似于 SQLite 的 FTS。MySQL 中的全文搜索可以在 MyISAM 和 InnoDB 存储引擎的表上使用,支持创建全文索引来加速文本查询的效率。这种索引适用于包含大量文本的列,可以高效地进行包含词汇的搜索查询。

MySQL本身不提供内建的中文分词功能。考虑到MySQL是一个常用的数据库,下面简单介绍一下它的全文搜索的使用方式。

MySQL 的全文索引可以在创建表时或对现有表添加索引的方式创建

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT(title, body)
) ENGINE=InnoDB;

或者在现有表上添加全文索引:

ALTER TABLE articles ADD FULLTEXT(title, body);

使用全文搜索

全文搜索主要使用 MATCH() ... AGAINST() 语法:

SELECT * FROM articles WHERE MATCH(title, body) AGAINST('database');

搜索模式

自然语言模式:默认模式,适用于大多数日常需求,如上例所示。

布尔模式:提供对查询更复杂控制的能力,例如:

SELECT * FROM articles WHERE MATCH(title, body) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);

这个查询查找包含 "MySQL" 而不包含 "Oracle" 的记录。

查询扩展模式:在自然语言模式基础上,将查询的结果作为新的查询的一部分来执行,以尝试扩大搜索结果集。

配置和优化

停用词:MySQL 全文搜索有默认的停用词列表,这些词在搜索时会被忽略。这个列表可以自定义。

最小词长度:MySQL 有一个配置项 ft_min_word_len,用来定义可被索引的最短词的长度,默认通常是4。

最后总结一下:

  • Elasticsearch和solr都功能强大,全文搜索和中文分词都不在话下,Elasticsearch目前最流行,中文资料也多,solr能找到的中文资料不多。

  • SQLite FTS和MySQL的全文搜索使用简单,并且不需要运行一个单独的服务,但是不支持分词搜索。

  • Typesense、MeiliSearch和Sphinx都是轻量级的,非常适合中型和小型系统使用,对服务器的要求很低。

在决定使用哪一个之前,建议在本地或测试环境中评估这些选项,看看哪个最符合你的需求,并根据实际体验来做出选择。这样可以确保选择的搜索解决方案能在你的服务器配置上提供最佳性能和稳定性。



我来说说