Manticore Search 中向渗透表添加规则的完整指南
什么是渗透表
渗透表(Percolate Table)是 Manticore Search 中的一种特殊表类型,它允许你将查询规则预先存储在表中,然后通过"渗透"操作来检查哪些规则与传入的文档匹配。这种反向搜索模式非常适合实现诸如警报系统、内容推荐等场景。
渗透表规则的基本结构
在渗透表中,每条规则必须遵循特定的字段结构:
| 字段名 | 类型 | 描述 | |-------|------|------| | id | bigint | 规则标识符(可省略,系统会自动分配) | | query | string | 全文查询表达式(可为空) | | filters | string | 非全文字段的附加过滤条件(可为空) | | tags | string | 一个或多个逗号分隔的标签,用于选择性管理规则 |
重要提示:不支持其他字段名称,使用非标准字段会引发错误。
添加规则的SQL方法
基本插入操作
-- 插入带有ID、查询和过滤条件的规则
INSERT INTO pq(id, query, filters) VALUES (1, '@title shoes', 'price > 5');
-- 插入带有ID、查询和标签的规则
INSERT INTO pq(id, query, tags) VALUES (2, '@title bag', 'Louis Vuitton');
-- 查看表中的所有规则
SELECT * FROM pq;
执行结果示例:
+------+--------------+---------------+---------+
| id | query | tags | filters |
+------+--------------+---------------+---------+
| 1 | @title shoes | | price>5 |
| 2 | @title bag | Louis Vuitton | |
+------+--------------+---------------+---------+
自动ID分配
如果省略ID字段,系统会自动分配一个ID:
-- 不指定ID的插入
INSERT INTO pq(query, filters) VALUES ('wristband', 'price > 5');
-- 查看结果
SELECT * FROM pq;
执行结果示例:
+---------------------+-----------+------+---------+
| id | query | tags | filters |
+---------------------+-----------+------+---------+
| 1657843905795719192 | wristband | | price>5 |
+---------------------+-----------+------+---------+
简化插入语法
在SQL中,可以省略字段名,但必须按特定顺序提供值:
-- 顺序为:ID, 查询, 标签, 过滤器
-- 使用0作为ID触发自动ID生成
INSERT INTO pq VALUES (0, '@title shoes', '', '');
INSERT INTO pq VALUES (0, '@title shoes', 'Louis Vuitton', '');
添加规则的JSON方法
Manticore Search 提供了两种JSON格式来添加渗透规则:
1. 原生JSON查询格式
这种格式与搜索API兼容:
PUT /pq/pq_table/doc/1
{
"query": {
"match": {
"title": "shoes"
},
"range": {
"price": {
"gt": 5
}
}
},
"tags": ["Louis Vuitton"]
}
2. SQL风格查询格式
这种格式更接近SQL语法:
PUT /pq/pq_table/doc/2
{
"query": {
"ql": "@title shoes"
},
"filters": "price > 5",
"tags": ["Louis Vuitton"]
}
重要区别:通过SQL接口插入JSON格式的规则时,JSON操作符会被视为普通文本,不会作为查询条件解析。如果需要使用JSON语法,必须通过HTTP JSON接口添加。
编程语言示例
PHP示例
$newstoredquery = [
'table' => 'test_pq',
'body' => [
'query' => [
'match' => ['title' => 'shoes'],
'range' => ['price' => ['gt' => 5]]
],
'tags' => ['Louis Vuitton']
]
];
$client->pq()->doc($newstoredquery);
Python示例
newstoredquery = {
"table": "test_pq",
"id": 2,
"doc": {
"query": {"ql": "@title shoes"},
"filters": "price > 5",
"tags": ["Louis Vuitton"]
}
}
indexApi.insert(newstoredquery)
Java示例
Map<String, Object> query = new HashMap<>();
query.put("ql", "@title shoes");
query.put("filters", "price>5");
query.put("tags", new String[] {"Louis Vuitton"});
Map<String, Object> newstoredquery = new HashMap<>();
newstoredquery.put("query", query);
InsertDocumentRequest newdoc = new InsertDocumentRequest("test_pq", 2L, newstoredquery);
indexApi.insert(newdoc);
更新现有规则
SQL方式
使用REPLACE命令更新规则:
-- 查看现有规则
SELECT * FROM pq;
-- 替换规则
REPLACE INTO pq(id,query) VALUES(2810823411335430148,'@title boots');
-- 验证更新
SELECT * FROM pq;
JSON方式
在HTTP JSON接口中使用?refresh=1
参数:
PUT /pq/pq/doc/2810823411335430149?refresh=1 -d '{
"query": {
"match": {
"title": "boots"
}
}
}'
最佳实践建议
- 合理使用标签:为规则添加有意义的标签,便于后续管理和批量操作
- ID管理:考虑是否让系统自动分配ID还是自行管理
- 性能考虑:复杂的查询规则会影响渗透性能,尽量保持规则简洁
- 测试规则:添加新规则后,使用实际文档测试渗透效果
- 文档化:为重要规则添加注释或通过标签系统记录其用途
通过掌握这些添加和更新渗透规则的技巧,你可以充分利用Manticore Search的渗透功能来构建强大的实时内容匹配系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考