索引结构

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

索引表结构介绍

每个Document都是由多个field组成,每个field中包含一系列的词语,构建索引的目的是为了加快检索的速度,根据映射关系方向的不同,索引可以分为:

  • 字段(field):用于定义索引表的字段名及字段类型。

  • 倒排索引(index):倒排索引存储了从单词到DocID的映射关系,形如:词:(Doc1,Doc2,...,DocN),倒排索引主要用在检索中,它能快速的定位用户查询到关键字对应的Document。

  • 正排索引(attribute):正排索引存储从DocID到field的映射关系,形如:DocID-->(term1,term2,...termn),正排索引分单值和多值两种,单值attribute由于长度是固定的(不包括string类型),因此查找效率高,而且可以支持更新。多值attribute表示某个field中有多个数据(数量不固定),由于长度不确定,因此查找效率相较与单值更慢,而且不能支持更新。

    正排索引主要是在查询到了某个Document后,根据docid值能快速获取到其attribute用来统计、排序、过滤中。目前引擎支持的正排字段基本类型包括:

    INT8(8位有符号数字类型), UINT8(8位无符号数字类型),

    INT16(16位有符号数字类型),

    UINT16(16位无符号数字类型),

    INTEGER(32位有符号数字类型),

    UINT32(32位无符号数字类型), INT64(64位有符号数字类型),

    UINT64(64位无符号数字类型),

    FLOAT(32位浮点数),

    DOUBLE(64位浮点数),

    STRING(字符串类型)

  • 摘要(summary):summary的存储形式与attribute类似,但是summary是将一个Document对应的多个field存储在一起,并且建立映射,所以能很快从docid定位到对应的summary内容。summary主要是用于结果的展示,一般而言summary的内容都比较大,对于每次查询而言不适合取过多的summary,只有最终需要展示结果的Document会取到对应的summary。由于summary过大,引擎在存储summary时提供压缩的机制,在schema中配置summary压缩,那么引擎在存储时会用zlib压缩后再存储,读取时引擎会先解压,再返回给用户。

说明

有关索引表配置的详细介绍的文章可参考索引表配置

索引schema示例

{
  "summarys": {
    "summary_fields": [
      "pk",
      "embedding",
      "cate_id"
    ],
    "parameter": {
      "file_compressor": "zstd"
    }
  },
  "indexs": [
    {
      "index_name": "id",
      "index_type": "PRIMARYKEY64",
      "index_fields": "pk",
      "has_primary_key_attribute": true,
      "is_primary_key_sorted": false
    },
    {
      "index_name": "vector",
      "index_type": "CUSTOMIZED",
      "index_fields": [
        {
          "field_name": "pk",
          "boost": 1
        },
        {
          "field_name": "cate_id",
          "boost": 1
        },
        {
          "field_name": "embedding",
          "boost": 1
        }
      ],
      "parameters": {
        "dimension": "128",
        "distance_type": "SquaredEuclidean",
        "vector_index_type": "Qc",
        "build_index_params": "{\"proxima.qc.builder.quantizer_class\":\"Int8QuantizerConverter\",\"proxima.qc.builder.quantize_by_centroid\":true,\"proxima.qc.builder.optimizer_class\":\"BruteForceBuilder\",\"proxima.qc.builder.thread_count\":10,\"proxima.qc.builder.optimizer_params\":{\"proxima.linear.builder.column_major_order\":true},\"proxima.qc.builder.store_original_features\":false,\"proxima.qc.builder.train_sample_count\":3000000,\"proxima.qc.builder.train_sample_ratio\":0.5}",
        "search_index_params": "{\"proxima.qc.searcher.scan_ratio\":0.01}",
        "embedding_delimiter": ",",
        "major_order": "col",
        "linear_build_threshold": "5000",
        "min_scan_doc_cnt": "20000",
        "enable_recall_report": "false",
        "is_embedding_saved": "false",
        "enable_rt_build": "false",
        "builder_name": "QcBuilder",
        "searcher_name": "QcSearcher"
      },
      "indexer": "aitheta2_indexer"
    }
  ],
  "attributes": [
    {
      "field_name": "pk",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "embedding",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "cate_id",
      "file_compress": "file_compressor"
    }
  ],
  "fields": [
    {
      "user_defined_param": {},
      "field_name": "pk",
      "field_type": "INTEGER",
      "compress_type": "equal"
    },
    {
      "user_defined_param": {
        "multi_value_sep": ","
      },
      "field_name": "embedding",
      "field_type": "FLOAT",
      "compress_type": "uniq",
      "multi_value": true
    },
    {
      "user_defined_param": {},
      "field_name": "cate_id",
      "field_type": "INTEGER",
      "compress_type": "equal"
    },
    {
      "field_name": "titile",
      "field_type": "TEXT",
      "analyzer": "chn_ecommerce_general"
    }
  ],
  "file_compress": [
    {
      "name": "file_compressor",
      "type": "zstd"
    },
    {
      "name": "no_compressor",
      "type": ""
    }
  ]
}

添加索引表

  1. 在实例管理界面,进入配置中心 > 索引结构页面,单击“添加索引表”:

image

  1. 配置索引表,模板选择通用模板:

image.png

  • 索引表:可自定义

  • 数据源:按需选择已添加数据源

  • 数据分片:根据用户购买的数据节点个数进行配置

  1. 设置字段,至少需要定义2个字段主键字段向量字段(向量字段需要设置为多值float类型):

image

如果需要带有类目的向量,可以在主键和向量字段中间加一个类目字段,类型要求单值或多值的整数类型:

image

属性和字段内容压缩

  • 属性字段可以选择是否压缩,默认为不压缩,选择file_compressor表示开启压缩

  • 字段内容可以选择是否压缩,默认为不压缩,默认多值和STRING类型选择uniq,单值数值类型是equal

说明
  • 使用向量检索,在定义字段时有位置要求,需要按照主键字段、标签字段(非必要)、向量字段的顺序创建。(如上图所示)

  • 如果开启了属性压缩,建议前往「部署管理-数据节点-在线表配置」编辑索引加载方式,以此降低对性能的影响

  1. 设置索引,主键字段索引类型设置为PRIMARYKEY64,向量索引类型选择CUSTOMIZED

image

索引字段设置压缩

  • 索引字段可以选择是否压缩,默认为不压缩,选择file_compressor表示开启压缩

说明
  • 主键索引不支持压缩

  • 如果开启了索引压缩,建议前往「部署管理-数据节点-在线表配置」编辑索引加载方式,以此降低对性能的影响

4.1. 为向量字段添加包含字段:

image

说明
  • 主键字段、向量字段必须填写,标签字段非必填,可以为空。

  • 仅支持选择固定的三个字段,不支持新增。

4.2. 高级配置,向量索引需要单独配置参数,可以参考如下配置,详情可参考向量索引

image

更多参数:

image

其中build_index_params的配置如下:

{
  "proxima.qc.builder.quantizer_class": "Int8QuantizerConverter",
  "proxima.qc.builder.quantize_by_centroid": true,
  "proxima.qc.builder.optimizer_class": "BruteForceBuilder",
  "proxima.qc.builder.thread_count": 10,
  "proxima.qc.builder.optimizer_params": {
    "proxima.linear.builder.column_major_order": true
  },
  "proxima.qc.builder.store_original_features": false,
  "proxima.qc.builder.train_sample_count": 3000000,
  "proxima.qc.builder.train_sample_ratio": 0.5
}

search_index_params的配置如下:

{
  "proxima.qc.searcher.scan_ratio": 0.01
}
  1. 配置完成后,单击保存版本,并在弹框后填写备注(可选),单击发布

image

  1. 索引表添加成功后,可在运维中心>部署管理中查看新加的索引表的拓扑:

image.png

  1. 若需要新加的索引表在集群中生效,需要在运维中心>运维管理中手动触发配置更新并全量,“配置更新”操作中执行“推送配置并触发索引重建”:

image.png

image.png

  1. 索引重建时,可以在运维中心>变更历史中的数据源变更中查看全量进度:

image

索引重建完成后,即可对新索引表进行查询。

重要
  • 字段设置有且仅有一个主键;

  • 字段设置中,至少需要有一个字段勾选搜索结果展示;

  • TEXT类型的字段需要设置分析方式,且不支持多值;

  • 索引设置有且仅有一个主键索引;

  • 多值分割符除默认分割符外,只支持单字符,且不支持全角字符;

  • 在设置数据分片时需要注意,假设集群的副本个数为2,数据分片设置为2,那么在购买实例时数据节点数量需要大于副本个数*数据分片,新加的索引表才能正常使用。

  • 分片数设置时参考下面几个规则:单个分片数据量不要超过6亿(最大21亿);单个分片的索引大小不要超过300G;如果有实时更新需求,单个分片数据更新tps不要超过4000(add命令的文档,如果只是update可以达到1w tps)。

编辑索引表

索引表版本介绍

新创建的索引表默认有2个版本:

  • index_config_v1:初次配置的索引表版本,若已推送配置并索引重建,状态变为“使用中”,若未推送配置并索引重建,状态则为“未使用”;

  • index_config_edit:正在编辑中的索引表版本,状态一直为“编辑中”;

随着索引表版本的连续发布版本名称会依次递增,比如第二个版本名为“index_config_v2”,第三个版本名为“index_config_v3”依次类推,为明显区分各个版本,每个版本的备注是必须填写的。

image.png

编辑并发布新的索引表版本

  1. 找到版本状态为“编辑中”的版本,单击编辑:

image.png

说明

cluster.json配置补充说明

平台支持配置索引整理策略,可以对customized_merge_configsegment_customize_metrics_updater(仅新实例支持)进行配置,如图:

image.png

参数详解参考:离线cluster配置

  1. 修改后,单击保存版本:

image

也可以切换到开发者模式手动编辑schema:

image

  1. 找到版本状态为“编辑中”的版本,单击发布,并填写备注,单击确定

image.png

此时系统会为该索引表生产一个新的索引表版本,版本状态为“未使用”。

image.png

  1. 若需要将新添加的索引表版本在集群中生效,则需要在运维中心>运维管理>更新配置中执行推送配置并触发索引重建

image.png

删除索引表版本

状态为“未使用”的索引表版本可以直接删除:

image.png

查看索引表版本

单击“查看”后,可跳转到索引表版本的只读配置界面:

image.png

  • 管理员模式:

image.png

  • 开发者模式:

image

删除索引表

若索引表中的索引表版本没有“使用中”的状态,可以直接删除索引表:

image

若索引表中的索引表版本有“使用中”的状态:

image

则需要按如下步骤操作,才可删除:

  1. 在运维管理>部署管理中,单击索引表,‘取消订阅’,如图:

    image.png

  2. 然后在配置中心--->索引结构中,删除对应的索引表:

    image.png

警告

如果在部署管理中,索引表取消订阅,一定要在索引结构中删除对应的索引表,否则会影响线上集群。

注意事项

  • 添加索引表时,数据源为必选项,若无数据源,则需要先添加数据源再添加索引表;

  • 索引表名称创建后不可修改;

  • 索引表中如有“使用中”的索引表版本,则无法直接删除索引表;

  • 每个索引表只能存在一个编辑中的索引表版本;