本文探索一下manticoreSearch的用法
根据网上的说法(道听途说):
mysql:快了128倍,
Elasticsearch:29倍(日志分析);15倍(小型数据集);5倍(中等大小);4(大型数据)
介绍:Manticore Search(也称为 Sphinx)是一个开源的全文搜索引擎,它提供了高性能的文本搜索功能,特别适用于需要快速搜索大量数据的应用场景,比如网站内容管理、数据库搜索等。Manticore Search 支持多种数据源,包括 MySQL、PostgreSQL、JSON 文件等,并通过 SQL 接口提供查询服务。
为什么快?
底层技术实现
ManticoreSearch是基于C++开发的,这使其能够充分利用底层硬件资源,提供更快的处理速度。其现代的多线程架构和高效的查询并处理机制也是其快速响应的关键因素(同时进行多个查询)。ManticoreSearch还支持列式存储,这种存储方式能够减少磁盘I/O操作,从而提高查询效率。
github地址(java版):
https://github.com/manticoresoftware/manticoresearch-java
官网:
https://manticoresearch.com/
使用:
安装
环境:需要有docker环境,不然安装会报错,又不想拉一个虚拟机去跑,因此就再windows上新建系统跑了。
系统环境:
1.环境检查
2.cmd运行(超管),他会安装Ubuntu系统,安装好需要重启电脑
在cmd运行命令:
wsl --install
重启后会看到Ubuntu的系统图标,点击就能进入系统的控制台。
然后会新建用户和密码:
3.创建一个权限文件夹下载他
wget https://repo.manticoresearch.com/manticore-repo.noarch.deb
sudo dpkg -i manticore-repo.noarch.deb
sudo apt update
sudo apt install manticore manticore-extra
4.运行服务:
sudo systemctl start manticore
5.验证服务是否正常:
systemctl status manticore
宿主机:
http://localhost:9308/
Java集成:
依赖:
<dependency>
<groupId>com.manticoresearch</groupId>
<artifactId>manticoresearch</artifactId>
<version>3.3.1</version>
<scope>compile</scope>
</dependency>
代码(使用时把创建表的注解打开,重复创建表是会报错的)
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
ApiClient defaultClient = com.manticoresearch.client.Configuration.getDefaultApiClient();
defaultClient.setBasePath("http://127.0.0.1:9312");
// defaultClient.setUsername("");
// defaultClient.setPassword("");
UtilsApi utilsApi = new UtilsApi(defaultClient);
try {
//创建表
// List<Object> createResultList = utilsApi.sql("CREATE TABLE a_test(title string attribute indexed, contents text, author_id bigint, a_id int, post_date timestamp,a_type int) charset_table = 'english,cjk,0..9' morphology = 'stem_en,icu_chinese'", true);
// log.info("创建表:{}",createResultList);
//插入数据
List<Object> insertResultList = utilsApi.sql("insert into a_test(title,contents,author_id,a_id,post_date,a_type) values('测试demo','SCG对战平台:平台简介:SCG(SuperChinaGame)对战平台是一款线上电子竞技对战平台,于2013年3月上线测试运营。',66,1,1697678523,1)", true);
log.info("插入数据:{}",insertResultList);
//查询数据
List<Object> selectResultList = utilsApi.sql("select * from a_test where a_id=1", true);
log.info("查询数据:{}",selectResultList);
//删除表
// List<Object> dropResultList = utilsApi.sql("DROP TABLE a_test", true);
// System.out.println(dropResultList);
} catch (Exception e) {
log.error("error:{}", e);
}
}
功能
官网介绍链接:
https://manual.manticoresearch.com/Functions
官网上介绍了:数学函数、搜索和排名、类型转换、数组和条件函数、日期时间、地理空间、字符串各种各样的功能,函数非常多,并且每个函数还附带了github地址,这里介绍一下常用的。
GREATEST():GREATEST(attr_json.some_array)
函数以 JSON 数组作为参数,并返回该数组中的最大值。也适用于 MVA。
LEAST():LEAST(attr_json.some_array)
函数以 JSON 数组作为参数,并返回该数组中的最小值。也适用于 MVA。
MAX()|MIN():返回两个参数中较大(小)的一个。
BM25A():BM25A(k1,b)
返回精确BM25A()
值。需要expr
排序器和启用index_field_lengths
。参数k1
和b
必须是浮点数。
EXIST():
用默认值替换不存在的列。它返回由“attr-name”指定的属性的值,如果该属性不存在,则返回“default-value”。不支持 STRING 或 MVA 属性。当搜索具有不同架构的多个表时,此函数很有用。
SELECT *, EXIST('gid', 6) as cnd FROM i1, i2 WHERE cnd>5
MIN_TOP_WEIGHT():返回当前前 N 个匹配中排名最差的元素的权重。
REMOVE_REPEATS():REMOVE_REPEATS ( result_set, column, offset, limit )
- 删除具有相同“列”值的重复调整行。
SELECT REMOVE_REPEATS((SELECT * FROM dist1), gid, 0, 10)
WEIGHT():
函数WEIGHT()
返回计算出的匹配分数。如果未指定排序,则结果将按 提供的分数降序排列WEIGHT()
。在此示例中,我们首先按重量排序,然后按整数属性排序。
上面的搜索执行的是简单匹配,其中所有单词都需要存在。但是,我们可以做更多(这只是一个简单的示例):
mysql> SELECT *,WEIGHT() FROM testrt WHERE MATCH('"list of business laptops"/3');
+------+------+-------------------------------------+---------------------------+----------+
| id | gid | title | content | weight() |
+------+------+-------------------------------------+---------------------------+----------+
| 1 | 10 | List of HP business laptops | Elitebook Probook | 2397 |
| 2 | 10 | List of Dell business laptops | Latitude Precision Vostro | 2397 |
| 3 | 20 | List of Dell gaming laptops | Inspirion Alienware | 2375 |
| 5 | 30 | List of ASUS ultrabooks and laptops | Zenbook Vivobook | 2375 |
+------+------+-------------------------------------+---------------------------+----------+
4 rows in set (0.00 sec)
mysql> SHOW META;
+----------------+----------+
| Variable_name | Value |
+----------------+----------+
| total | 4 |
| total_found | 4 |
| total_relation | eq |
| time | 0.000 |
| keyword[0] | list |
| docs[0] | 5 |
| hits[0] | 5 |
| keyword[1] | of |
| docs[1] | 4 |
| hits[1] | 4 |
| keyword[2] | business |
| docs[2] | 2 |
| hits[2] | 2 |
| keyword[3] | laptops |
| docs[3] | 5 |
| hits[3] | 5 |
+----------------+----------+
16 rows in set (0.00 sec)
这里我们搜索四个单词,但即使只找到四个单词中的三个,也可能匹配。搜索将使包含所有单词的文档排名更高。
QUERY():返回当前搜索查询。
QUERY()`是一个后限制表达式,旨在与SNIPPET()一起使用。
表函数是一种查询后结果集处理机制。表函数将任意结果集作为输入,并返回新的处理后的集合作为输出。第一个参数应该是输入结果集,但表函数可以选择接受和处理更多参数。表函数可以完全更改结果集,包括架构。目前,仅支持内置表函数。表函数适用于外部SELECT
和nested SELECT。
SNIPPET():该SNIPPET()
函数可用于突出显示给定文本中的搜索结果。前两个参数是:要突出显示的文本和查询。可以将选项作为第三、第四等参数传递给函数。SNIPPET()
可以直接从表中获取要突出显示的文本。在这种情况下,第一个参数应该是字段名称:
SELECT SNIPPET(body, QUERY()) FROM myIndex WHERE MATCH('my.query')
在此示例中,QUERY()
表达式返回当前的全文查询。SNIPPET()
还可以突出显示非索引文本:
mysql SELECT id, SNIPPET('text to highlight', 'my.query', 'limit=100') FROM myIndex WHERE MATCH('my.query')
此外,它还可以用于使用用户定义函数 (UDF) 突出显示从其他来源获取的文本:
SELECT id, SNIPPET(myUdf(id), 'my.query', 'limit=100') FROM myIndex WHERE MATCH('my.query')
在此上下文中,myUdf()
是一个用户定义函数 (UDF),它通过 ID 从外部存储源检索文档。该SNIPPET()
函数被视为“后限”函数,这意味着片段的计算会延迟到整个最终结果集准备好之后,甚至在LIMIT
应用子句之后也是如此。例如,如果LIMIT 20,10
使用子句,SNIPPET()
则调用的次数不会超过 10 次。
需要注意的是,SNIPPET()
不支持基于字段的限制。要使用此功能,请改用HIGHLIGHT()。
关于外部连接
在官网的介绍里,它实现了很多外部连接工具,但是我测试了几款,多多少少都有很多基本功能都用不了(在navicat虽然能连接上,但是扫描存储引擎会报错;然后又试了Dbeaver(24.3.2),发现虽然能进去,但是拿数据时它进行了重命名,导致保持),使用了Idea的 Db插件是可行的,可以查和加数据,不能删和该,非常的‘零’性化,因为它修改和删除数据的时候需要去查这条数据是否有被修改过,查询的语句报错,很多都需要sql命令去实现,并且需要微调;
并且mybaitsplus的生成代码插件也使用不了,这个就很鸡肋了
总的来说:连接的软件需要简单一点,不要搞什么强一致性的和花里胡哨的
Idea插件连接Db插件:
连接url(无密码):
loclhost:9306
使用到碰到的问题:
1、是不支持重命名的,示例:
SELECT at2.* FROM Manticore.a_test AS at2
LIMIT 0, 200
2、建表需要加后缀
charset_table = 'english,cjk,0..9' morphology = 'stem_en,icu_chinese'
完整sql:
create table test1 ( a1 integer, a2 integer )charset_table = 'english,cjk,0..9' morphology = 'stem_en,icu_chinese'
3、在官方的文档中是有很多的连接方式的,并且文档中还还有’vip’通道,即新启一个线程,避免生产的线程挤满上不去的情况
url:
https://manual.manticoresearch.com/Connecting_to_the_server/HTTP