(四)、Manticore Search学习笔记之本地表介绍
创建本地表
Manticore Search虽然主要操作语言是SQL,但是Manticore Search中没有数据库的概念,只有表(相当于ES中的索引),在Manticore Search中, 有两种方式来管理表
在线模式管理(RT mode)
实时模式不需要在配置文件中定义表,但是,searchd
部分中的data_dir指令是强制性的,索引文件存储在 data_dir 中
复制仅在此模式下可用
你可以使用 SQL 命令,例如CREATE TABLE
,ALTER TABLE
,DROP TABLE
等命令来创建表、修改表和删除表,这种模式对于real-time和percolate tables特别有用
表名在创建时转换为小写
在配置文件中定义表模式(Plain mode)
在这种模式下,你可以在配置文件中指定表结构,Manticore 在启动时读取此模式,并在表不存在时创建表。这种模式特别适用于使用来自外部存储的数据的普通表(plain tables)
删除一张表,从配置文件中删除它或删除路径设置并向服务器发送HUP信号或重启它
在这种模式下,表名是区分大小写的
此模式支持所有表类型
表的类型和模式
表类型 | RT mode | Plain mode |
---|---|---|
实时表(Real-time) | 支持 | 支持 |
普通表(Plain) | 不支持 | 支持 |
渗透表(Percolate) | 支持 | 支持 |
分布式表(Distributed) | 支持 | 支持 |
模板表(Template) | 支持 | 支持 |
实时表(Real-time table)
- 多个磁盘块 - 这些保存在磁盘上,并且像一个普通的表格一样结构化。
- 单个内存块 - 保存在内存中并收集所有更改
RAM块的大小由rt_mem_limit设置控制,一旦达到此限制,RAM块被传输到磁盘作为磁盘块。如果有太多的磁盘块,Manticore会将其中一些合并以提高性能。
创建实时表
SQL:
CREATE TABLE products(title text, price float) morphology='stem_en';
从已存在的表中复制表结构或数据
CREATE TABLE table_name LIKE old_table_name [WITH DATA]
可以用实时表做什么:
- 添加文档
- 使用
Update
更新属性和全文字段 - 删除文档
- 清空表
- 在线使用 ALTER 命令更改架构,如“在线更改架构”中所述。
- 在配置文件中定义表,详见“定义表”
- 使用UUID功能进行自动ID分配
不能用实时表做什么:
- 使用索引器功能摄取数据
- 将其连接到源,以便从外部存储轻松索引
- 更新 killlist_target,因为它是由实时表自动管理的
实时表文件结构
下表概述了不同的文件扩展名及其在实时表中的相应描述
文件扩展名 | 描述 |
---|---|
.lock | 一个锁定文件,确保一次只有一个进程可以访问该表 |
.ram | 表的RAM块,存储在内存中并用作更改的累加器 |
.meta | 定义实时表结构和设置的表头 |
.*.sp* | 存储在磁盘上的磁盘块与普通表具有相同的格式。当 RAM 块大小超过 rt_mem_limit 时创建这些块。 |
普通表(Plain table)
普通表是非渗透搜索的基本元素,只能在配置文件中使用Plain模式定义,并且不支持在RT模式下使用,通常与数据源结合使用,以处理来自外部存储的数据,并且可以稍后附加到实时表中。
创建普通表
要创建一个普通表,你需要在配置文件中定义它。这不支持CREATE TABLE命令。
以下是一个普通表配置和从MySQL数据库获取数据的来源的例子:
source source {
type = mysql
sql_host = localhost
sql_user = myuser
sql_pass = mypass
sql_db = mydb
sql_query = SELECT id, title, description, category_id from mytable
sql_attr_uint = category_id
sql_field_string = title
}
table tbl {
type = plain
source = source
path = /path/to/table
}
可以用普通表做什么:
- 从外部存储使用源和索引器构建它
- 对整数、浮点数、字符串和MVA属性执行就地更新
- 更新它的
killlist_target
不可以用普通表做什么:
- 在表构建完成后插入额外的数据
- 从表中删除数据
- 在线创建、修改或删除表
- 使用UUID进行自动ID生成(来自外部存储的数据必须包含唯一标识符)
渗透表(percolate table)
渗透表是一种特殊表,用于存储查询而非文档,它用于前瞻性搜索或反向搜索
- 要了解如何对percolate表执行搜索查询,请参阅“Percolate查询”部分。
- 要了解如何准备用于搜索的表,请参阅“向渗透表添加规则”部分。
Percolate表的模式是固定的,包含以下字段
字段 | 描述 |
---|---|
ID | 一个具有自动增量功能的无符号64位整数。在添加PQ规则时可以省略,如添加PQ规则所述。 |
Query | 规则全文查询,可以将其视为 MATCH 子句或 JSON /search 的值。如果查询中使用了每个字段的操作符,则需要在 percolate 表配置中声明全文字段。如果存储的查询仅用于属性过滤(不包含全文查询),则查询值可以为空或省略。此字段的值应与创建 percolate 表时指定的文档模式相对应。 |
Filters | 可选的,过滤器是一个可选字符串,包含and/or表达式的属性过滤器,定义方式与WHERE子句或JSON过滤相同。此字段的值应对应于预期的文档模式,该模式在创建渗透表时指定。 |
Tags | 可选的,标签表示由逗号分隔的字符串标签列表,可用于过滤/删除PQ规则。在执行Percolate查询时,这些标签也可以与匹配的文档一起返回。 |
请注意在创建渗透表时不需要添加上述字段
在创建新的percolate表时,需要注意的是指定文档的预期模式,这将根据您稍后添加的规则进行检查。这与创建任何其他本地表的方式相同。
创建渗透表SQL语句:
CREATE TABLE products(title text, meta json) type='pq';
模板表(Template table)
模板表是 Manticore 中的一种特殊表,它不存储任何数据,也不会在您的磁盘上创建任何文件。尽管如此,它可以具有与普通表或实时表相同的 NLP 设置。模板表可用于以下目的
- 作为在纯模式下继承设置的模板,简化您的 Manticore 配置文件
- 使用
CALL KEYWORDS
命令生成关键词 - 使用
CALL SNIPPETS
命令高亮任意字符串
模板表配置示例:
table template {
type = template
morphology = stem_en
wordforms = wordforms.txt
exceptions = exceptions.txt
stopwords = stopwords.txt
}