将OB上层数据存储为多模态,怎么存

将OB上层数据存储为多模态 怎么存呢

2 个赞

@论坛小助手

如何在OceanBase中存储多模态数据

根据文档库中的信息,OceanBase支持通过特定的数据类型来存储多模态(或称多模)数据。这种数据类型能够处理复杂且变长的数据格式,如JSON和GIS等。

推荐使用原生多模类型

  • Text/Varchar2 类型:虽然您可以基于标准定义的文本格式直接将多模数据以TextVarchar2的形式存储在数据库里,但这种方式每次查询都需要对数据进行解析,效率较低。
  • 原生多模类型:建议采用这种方式存储多模数据。一旦存入后,再执行查询时无需重新解析,并且在存储空间上也进行了优化。多模数据的存储

当前版本支持的多模数据类型

  • 在MySQL模式下,目前仅支持两种类型的多模数据:GISJSON。对于JSON格式的数据,还可以利用虚拟生成函数在任意JSON内部元素上创建二级索引,以提高查询效率。多模数据的数据交换

示例

如果您想在表中添加一个多模字段来存储JSON数据,可以这样定义列:

CREATE TABLE example (
  id INT PRIMARY KEY,
  json_data JSON
);

然后,您可以向这个字段插入符合JSON格式的数据:

INSERT INTO example (id, json_data) VALUES (1, '{"name": "OceanBase", "type": "database"}');

希望这些信息对您有所帮助!如果还有其他关于如何更好地管理和查询多模态数据的问题,请随时提问。

检索到的文档如下:

  1. 多模数据类型
  2. 备份前准备
  3. 表存储
  4. 数据库对象存储
  5. oceanbase.CDB_OB_BACKUP_SET_FILES
  6. oceanbase.DBA_OB_BACKUP_PARAMETER
1 个赞

顶一下

@论坛小助手,目前我想同时兼容通过唯一 ID精确查找、通过名称全文检索、通过语义查找向量检索召回,这可能是我一张表的三个字段,如何设计,以达到这个目标

设计方案以支持通过唯一ID精确查找、通过名称全文检索和通过语义向量检索召回

为了实现您提到的功能需求,即通过唯一ID进行精确查找、通过名称执行全文检索以及利用向量数据来进行语义搜索,您可以参考以下设计方案来构建数据库表结构。这个设计将包括三个主要部分:唯一标识符字段、用于全文检索的字段及一个存储向量数据以便于相似度搜索的字段。

1. 创建表结构

首先,需要创建一个合适的表来容纳这些不同类型的数据。这里假设我们正在处理的是某种类型的实体信息,例如产品或文档等。

CREATE TABLE entity (
  id INT PRIMARY KEY,  -- 唯一ID
  name VARCHAR(255),   -- 名称
  description TEXT,    -- 描述(可选)
  vector_data BLOB,    -- 向量数据
  FULLTEXT (name)      -- 在`name`列上创建全文索引
);
  • id 字段作为每条记录的唯一标识符。
  • name 字段用于存放每个实体的名字,并且在该列上添加了全文索引以支持全文搜索。
  • vector_data 字段用来存储经过预处理转换成向量形式的文本或其他特征信息。注意,这里使用了BLOB类型来存储向量数据,具体选择哪种数据类型取决于实际使用的向量表示方法及其尺寸大小。

2. 索引优化

  • 唯一ID查询:由于id已经是主键,因此不需要额外为它创建索引来加速基于ID的查询。
  • 全文检索:已经在name字段上建立了全文索引,这将允许用户通过关键词对name执行高效的全文搜索。
  • 向量检索:对于向量检索功能,OceanBase支持向量搜索插件(OBVectorSearch)。您需要按照官方文档安装配置好相应组件后,再根据具体的业务场景建立相应的向量索引。下面是一个简单的例子说明如何插入向量数据并执行搜索:
# Python示例代码
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 假设已经完成了向量库的初始化和连接设置
collection = Collection("entity")  # 实体集合名称与表名一致

# 构造向量数据
vector_field = "vector_data"
vector_dim = 64  # 向量维度
entities = [
    [i for i in range(10)],  # 示例中的id
    ["entity_{}".format(i) for i in range(10)],  # 名称
    [[random.uniform(-1, 1) for _ in range(vector_dim)] for _ in range(10)]  # 随机生成的向量数据
]

# 插入向量数据到集合
collection.insert(entities)

# 执行向量相似性搜索
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
    data=[[random.uniform(-1, 1) for _ in range(vector_dim)]],  # 待匹配的目标向量
    anns_field=vector_field,
    param=search_params,
    limit=5,
    output_fields=["id", "name"]
)

for result in results:
    print(result)

请注意,上述Python代码示例仅作演示用途,实际部署时请参照官方提供的最新指南调整参数配置。

3. 总结

通过上述步骤,您可以构建出一个能够满足同时支持基于唯一ID的快速查找、基于名称的全文检索以及基于向量数据的语义相似性搜索的高效系统。希望这些建议能满足您的需求。如果还有其他更详细的疑问或需要进一步的帮助,请随时告诉我!

详情请参考:

  1. 并行执行调优技巧
  2. 全文查询
  3. 排序 limit 场景性能优化
  4. 创建索引
  5. 使用 Python 快速进行向量检索
  6. 单表查询
1 个赞

@论坛小助手 解释一下oceanbase是如何实现这三种方式的同时统一的,在数据存储架构上我们要入额设计才能实现这个兼容

为了实现通过唯一ID精确查找、通过名称全文检索以及通过语义向量检索召回这三种方式的同时统一,OceanBase在数据存储架构上提供了一些关键特性和设计思路。以下是详细的解释和设计建议:

1. 唯一ID精确查找

  • 主键索引:OceanBase使用主键索引(通常是B树或哈希索引)来支持基于唯一ID的快速查找。主键索引确保了每个记录的唯一性,并且能够高效地进行单点查询。
  • 表结构:在创建表时,可以将唯一ID字段设置为主键。
    CREATE TABLE entity (
      id INT PRIMARY KEY,
      name VARCHAR(255),
      description TEXT,
      vector_data BLOB
    );
    

2. 通过名称全文检索

  • 全文索引:OceanBase支持在某些字段上创建全文索引,以实现高效的全文搜索。全文索引适用于需要对文本字段进行关键词匹配的情况。
  • 表结构:在创建表时,可以在需要进行全文检索的字段上添加全文索引。
    CREATE TABLE entity (
      id INT PRIMARY KEY,
      name VARCHAR(255),
      description TEXT,
      vector_data BLOB,
      FULLTEXT (name)
    );
    
  • 查询示例
    SELECT * FROM entity WHERE MATCH (name) AGAINST ('关键词');
    

3. 通过语义向量检索召回

  • 向量索引:OceanBase通过向量索引插件(如OBVectorSearch)来支持高效的向量相似度搜索。向量索引可以用于存储和检索高维向量数据。
  • 表结构:在创建表时,需要一个字段来存储向量数据。
    CREATE TABLE entity (
      id INT PRIMARY KEY,
      name VARCHAR(255),
      description TEXT,
      vector_data BLOB
    );
    
  • 向量索引配置:安装并配置OBVectorSearch插件,然后在表中为向量数据字段创建向量索引。
    • Python示例代码
      from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
      
      # 连接到Milvus
      connections.connect("default", host="localhost", port="19530")
      
      # 定义向量字段
      vector_field = FieldSchema(name="vector_data", dtype=DataType.FLOAT_VECTOR, dim=128)
      
      # 定义其他字段
      id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
      name_field = FieldSchema(name="name", dtype=DataType.VARCHAR, max_length=255)
      description_field = FieldSchema(name="description", dtype=DataType.VARCHAR, max_length=1024)
      
      # 创建集合模式
      schema = CollectionSchema(
          fields=[id_field, name_field, description_field, vector_field],
          description="Entity collection"
      )
      
      # 创建集合
      collection = Collection(name="entity", schema=schema)
      
      # 插入向量数据
      entities = [
          [i for i in range(10)],  # 示例中的id
          ["entity_{}".format(i) for i in range(10)],  # 名称
          ["description_{}".format(i) for i in range(10)],  # 描述
          [[random.uniform(-1, 1) for _ in range(128)] for _ in range(10)]  # 随机生成的向量数据
      ]
      collection.insert(entities)
      
      # 创建向量索引
      index_params = {
          "index_type": "IVF_FLAT",
          "params": {"nlist": 128},
          "metric_type": "L2"
      }
      collection.create_index(field_name="vector_data", index_params=index_params)
      
      # 加载集合
      collection.load()
      
      # 执行向量相似性搜索
      search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
      results = collection.search(
          data=[[random.uniform(-1, 1) for _ in range(128)]],  # 待匹配的目标向量
          anns_field="vector_data",
          param=search_params,
          limit=5,
          output_fields=["id", "name"]
      )
      
      for result in results:
          print(result)
      

总结

通过上述设计,您可以在OceanBase中同时实现以下功能:

  • 唯一ID精确查找:通过主键索引实现。
  • 名称全文检索:通过全文索引实现。
  • 语义向量检索召回:通过向量索引插件(如OBVectorSearch)实现。

这些特性使得OceanBase能够在同一个表中支持多种查询方式,并且能够高效地处理各种查询需求。希望这些信息对您有所帮助!如果还有其他问题,请随时提问。

检索到的文档如下:

  1. OceanBase 数据库概述
  2. OceanBase 概述
  3. OceanBase 数据库整体架构
  4. OceanBase 数据库和 MySQL 兼容性介绍
  5. 兼容模式
  6. OceanBase 集群高可用部署方案简介
  7. 登录 OceanBase 租户
  8. 使用数据编码和压缩

@论坛小助手 oceanbase实现这三个查询需求的基本原理是什么

OceanBase实现这三个查询需求(唯一ID精确查找、名称全文检索、语义向量检索召回)的基本原理如下:

1. 唯一ID精确查找

基本原理:

  • 主键索引:OceanBase使用主键索引(通常是B树或哈希索引)来支持基于唯一ID的快速查找。主键索引确保了每个记录的唯一性,并且能够高效地进行单点查询。
  • 分区和分布:数据以分片的形式存储于每个节点,节点之间通过网络通信。OceanBase会根据一定的均衡策略将数据分片均衡到多个observer进程上。对于唯一ID的查询,系统可以通过分区键直接定位到具体的分片,从而快速返回结果。

示例表结构:

CREATE TABLE entity (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  description TEXT,
  vector_data BLOB
);

查询示例:

SELECT * FROM entity WHERE id = 1;

2. 名称全文检索

基本原理:

  • 全文索引:OceanBase支持在某些字段上创建全文索引,以实现高效的全文搜索。全文索引适用于需要对文本字段进行关键词匹配的情况。全文索引使用倒排索引来加速关键词匹配。
  • 查询处理:当用户发起全文检索请求时,系统会解析查询条件,然后使用倒排索引快速定位包含指定关键词的文档,最终返回匹配的结果。

示例表结构:

CREATE TABLE entity (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  description TEXT,
  vector_data BLOB,
  FULLTEXT (name)
);

查询示例:

SELECT * FROM entity WHERE MATCH (name) AGAINST ('关键词');

3. 语义向量检索召回

基本原理:

  • 向量索引:OceanBase通过向量索引插件(如OBVectorSearch)来支持高效的向量相似度搜索。向量索引可以用于存储和检索高维向量数据。
  • 近似最近邻搜索:向量索引通常使用近似最近邻算法(如IVF_FLAT、HNSW等)来加速向量的相似度搜索。这些算法能够在大规模向量数据中快速找到与目标向量最相似的结果。
  • 查询处理:当用户发起向量检索请求时,系统会计算目标向量与索引中向量的相似度,然后返回最相似的结果。

示例表结构:

CREATE TABLE entity (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  description TEXT,
  vector_data BLOB
);

向量索引配置示例(Python代码):

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
import random

# 连接到Milvus
connections.connect("default", host="localhost", port="19530")

# 定义向量字段
vector_field = FieldSchema(name="vector_data", dtype=DataType.FLOAT_VECTOR, dim=128)

# 定义其他字段
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
name_field = FieldSchema(name="name", dtype=DataType.VARCHAR, max_length=255)
description_field = FieldSchema(name="description", dtype=DataType.VARCHAR, max_length=1024)

# 创建集合模式
schema = CollectionSchema(
    fields=[id_field, name_field, description_field, vector_field],
    description="Entity collection"
)

# 创建集合
collection = Collection(name="entity", schema=schema)

# 插入向量数据
entities = [
    [i for i in range(10)],  # 示例中的id
    ["entity_{}".format(i) for i in range(10)],  # 名称
    ["description_{}".format(i) for i in range(10)],  # 描述
    [[random.uniform(-1, 1) for _ in range(128)] for _ in range(10)]  # 随机生成的向量数据
]
collection.insert(entities)

# 创建向量索引
index_params = {
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128},
    "metric_type": "L2"
}
collection.create_index(field_name="vector_data", index_params=index_params)

# 加载集合
collection.load()

# 执行向量相似性搜索
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
    data=[[random.uniform(-1, 1) for _ in range(128)]],  # 待匹配的目标向量
    anns_field="vector_data",
    param=search_params,
    limit=5,
    output_fields=["id", "name"]
)

for result in results:
    print(result)

总结

通过上述设计,OceanBase能够在同一个表中同时支持以下功能:

  • 唯一ID精确查找:通过主键索引实现。
  • 名称全文检索:通过全文索引实现。
  • 语义向量检索召回:通过向量索引插件(如OBVectorSearch)实现。

这些特性使得OceanBase能够在同一个表中高效地处理多种查询需求。希望这些信息对您有所帮助!如果还有其他问题,请随时提问。

具体信息可参考以下文档:

  1. 分布式执行和并行查询
  2. OceanBase 与 LangChain 集成
  3. 产品 FAQ
  4. 视图操作与数据访问指南
  5. OceanBase 数据库概述
  6. 全文查询
  7. OceanBase 数据库多租户线程
  8. SUBPLAN FILTER
  9. 基于规则的路径选择

有发布oceanbase湖库一体版本,应该能满足你的需求

关于数据多模态存储与检索,学习了