2292782条数据,使用DuckDB在5个字段中查询包含特定关键词的记录,需要用9秒左右,明显不能满足需求,所以决定尝试用Manticore Search。
从官网下载的manticore-14.1.0-25110709-2b53a9307-x64.exe是个网络安全程序(找了一圈只有网络安全程序下载),安装时无法访问国外网络下载所需数据,所以会失败。但安装过程中,其会在C:\Program Files (x86)\Manticore下生成一个src.txt(印象中),需要下载的文件链接就在其中,可以自行下载后解压到C:\Program Files (x86)\Manticore\目录下(结构如下所示),即可完成安装。
1
2
3
4
5
6
7
|
C:\Program Files (x86)\Manticore>
├─bin
├─etc
├─include
├─share
├─usr
└─var
|
我的数据本来存放在DuckDB中,首先使用的是CSV导入,但是因为我的数据中有一个文本字段包含\n、\r、\t、,、"等特殊字符,DuckDB导出到CSV后,会陷入CSV分隔符地狱…..再用Manticore Search导入会因为CSV分隔符导致无法导入,所以只能使用MySQL导入,(临时使用绿色版MariaDB搭建,将DuckDB灌入其中)。
最后的配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
searchd {
listen = 127.0.0.1:9312
listen = 127.0.0.1:9306:mysql
listen = 127.0.0.1:9308:http
log = C:/Program Files (x86)/Manticore/var/log/manticore/searchd.log
query_log = C:/Program Files (x86)/Manticore/var/log/manticore/query.log
pid_file = C:/Program Files (x86)/Manticore/var/run/manticore/searchd.pid
# data_dir = D:/Manticore/data
query_log_format = sphinxql
binlog_path = # ← 留空即禁用
}
source data_source {
type = mysql
sql_host = localhost
sql_user = root
sql_pass = 1xxx6
sql_db = texxa
sql_port = 3306
sql_query = \
SELECT \
infoId, \
标题, 买家单位, 买家单位联系人, 买家单位联系方式, \
卖家单位, 卖家单位联系人, 卖家单位联系方式, infoContent, \
信息类型, 二级信息类型, 省, 市, 县, \
UNIX_TIMESTAMP(发布时间) AS 发布时间, \
商品编号, 买家预算, 卖家金额 \
FROM together
# 全文字段(用于 MATCH)
sql_field_string = 标题
sql_field_string = 买家单位
sql_field_string = 买家单位联系人
sql_field_string = 买家单位联系方式
sql_field_string = 卖家单位
sql_field_string = 卖家单位联系人
sql_field_string = 卖家单位联系方式
sql_field_string = infoContent
# 属性字段(不会进行全文检索索引,用于 WHERE / ORDER BY / SELECT)
sql_attr_string = 信息类型
sql_attr_string = 二级信息类型
sql_attr_string = 省
sql_attr_string = 市
sql_attr_string = 县
sql_attr_timestamp = 发布时间
sql_attr_string = 商品编号
sql_attr_float = 买家预算
sql_attr_float = 卖家金额
# 文档 ID 必须是第一个字段且为 BIGINT
}
# ============ 普通索引(只读,高性能) ============
index my_index {
type = plain #普通表,用于只查不改的数据,速度更快
source = data_source # ✅ 必须与上面定义的 source 名称完全一致!
path = D:/Manticore/data/my_index
# 支持中文分词与短语匹配
ngram_len = 1
ngram_chars = cjk
# phrase_boundary = ".,?!"
# phrase_boundary_step = 1
# blend_chars = "-,.,_,/"
}
|
提前将manticore.conf从etc目录中移动到了bin目录下,方便引用。
- 执行
indexer.exe --config manticore.conf tender_index --rotate将数据导入到Manticore Search中并建立索引。
- 执行
searchd.exe --config manticore.conf启动服务
- 经测试,同等条件(硬件、关键词等相同)下,相较于
DuckDB的9秒,Manticore Search可实现秒查。
并且Manticore Search支持中文分词,并且支持短语匹配,支持MySQL协议连接其服务端,语法也基本属于MySQL语句(如SELECT * FROM tender_index WHERE MATCH('"我是关键词"');),同时自带HTTP API查询接口。
官方手册:https://manual.manticoresearch.com/zh/Introduction