全部产品
Search
文档中心

智能开放搜索 OpenSearch:索引结构

更新时间:Sep 03, 2024

索引表结构介绍

每个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示例

{
  "file_compress": [
    {
      "name": "file_compressor",
      "type": "zstd"
    },
    {
      "name": "no_compressor",
      "type": ""
    }
  ],
  "table_name": "test",
  "summarys": {
    "summary_fields": [
      "id",
      "fb_boolean",
      "fb_datetime",
      "fb_string",
      "fb_decimal",
      "fb_bigint",
      "fb_text"
    ],
    "parameter": {
      "file_compressor": "zstd"
    }
  },
  "indexs": [
    {
      "index_name": "id",
      "index_type": "PRIMARYKEY64",
      "index_fields": "id",
      "has_primary_key_attribute": true,
      "is_primary_key_sorted": false
    },
    {
      "index_name": "fb_boolean",
      "index_type": "STRING",
      "index_fields": "fb_boolean",
      "file_compress": "file_compressor",
      "format_version_id": 1
    },
    {
      "index_name": "fb_datetime",
      "index_type": "STRING",
      "index_fields": "fb_datetime",
      "file_compress": "file_compressor",
      "format_version_id": 1
    },
    {
      "index_name": "fb_string",
      "index_type": "STRING",
      "index_fields": "fb_string"
    },
    {
      "index_name": "fb_text",
      "index_type": "TEXT",
      "index_fields": "fb_text"
    }
  ],
  "attributes": [
    {
      "field_name": "id",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "fb_boolean",
      "file_compress": "file_compressor"
    },
    {
      "field_name": "fb_datetime",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "fb_string",
      "file_compress": "file_compressor"
    },
    {
      "field_name": "fb_decimal",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "fb_bigint",
      "file_compress": "no_compressor"
    }
  ],
  "fields": [
    {
      "user_defined_param": {},
      "field_name": "id",
      "field_type": "INT64",
      "compress_type": "equal"
    },
    {
      "field_name": "fb_boolean",
      "field_type": "STRING",
      "compress_type": "uniq"
    },
    {
      "field_name": "fb_datetime",
      "field_type": "STRING",
      "compress_type": "uniq"
    },
    {
      "user_defined_param": {
        "multi_value_sep": ","
      },
      "field_name": "fb_string",
      "field_type": "STRING",
      "compress_type": "equal",
      "multi_value": true
    },
    {
      "field_name": "fb_decimal",
      "field_type": "DOUBLE"
    },
    {
      "field_name": "fb_bigint",
      "field_type": "INT64",
      "compress_type": "equal"
    },
    {
      "field_name": "fb_text",
      "field_type": "TEXT",
      "analyzer": "chn_standard"
    }
  ]
}

添加索引表

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

image

  1. 设置索引表,选择数据源,设置数据分片

image.png

  1. 字段设置:

image

多值字段分隔设置

image

默认为ha3分隔符^] ,用户也可根据业务需求自定义分隔符。

属性和字段内容压缩

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

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

说明

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

  1. 索引设置:

image

索引字段设置压缩

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

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

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

  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

说明

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

删除索引表

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

image

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

image

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

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

    image.png

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

    image.png

警告

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

注意事项

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

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

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

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