ManticoreSearch搭建

2292782条数据,使用DuckDB5个字段中查询包含特定关键词的记录,需要用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.confetc目录中移动到了bin目录下,方便引用。

  • 执行indexer.exe --config manticore.conf tender_index --rotate将数据导入到Manticore Search中并建立索引。
  • 执行searchd.exe --config manticore.conf启动服务
  • 经测试,同等条件(硬件、关键词等相同)下,相较于DuckDB9秒,Manticore Search可实现秒查。 并且Manticore Search支持中文分词,并且支持短语匹配,支持MySQL协议连接其服务端,语法也基本属于MySQL语句(如SELECT * FROM tender_index WHERE MATCH('"我是关键词"');),同时自带HTTP API查询接口。

官方手册:https://manual.manticoresearch.com/zh/Introduction