Skip to content

倒排索引类型

Wenyi Duan edited this page Nov 2, 2022 · 3 revisions

PACK 索引

PACK索引介绍

PACK索引是多字段索引。对TEXT类型的字段建立索引。与TEXT索引相比,该索引将多个TEXT字段合并,建立一个索引,共同检索;该索引还可存储段落信息,用于查询每一个检索词所在的段落及相关信息。 可以采用截断,高频词bitmap和tfbitmap的方式提高检索性能 .

信息名称 df ttf tf fieldmap section信息 position positionpayload docpayload termpayload
是否支持 支持 可选 可选 不支持 可选 可选 可选 可选 可选

pack索引配置示例

{
	"index_name": "pack_index",                                      
	"index_type" : "PACK",                                      
	"term_payload_flag" : 1,                                           
	"doc_payload_flag" : 1,                                            
	"position_list_flag" : 1,                                          
	"position_payload_flag" : 1,                                       
	"term_frequency_flag" : 1,                                         
	"term_frequency_bitmap" : 1,                                       
	"has_section_attribute" : false,                                   
	"section_attribute_config":                                        
	{
		"has_section_weight":true,
		"has_field_id":true,
		"compress_type":"uniq|equal"
	},
	"high_frequency_dictionary" : "bitmap1",                           
	"high_frequency_adaptive_dictionary" : "df",                       
	"high_frequency_term_posting_type" : "both",                       
	"index_fields":                                                    
	[
		{"field_name":"subject", "boost":200000},                      
		{"field_name":"company_name", "boost":600000},
		{"field_name":"feature_value", "boost":600000},
		{"field_name":"summary", "boost":600000}
	],
	"index_analyzer" : "taobao_analyzer",                                      
    "file_compress":"simple_compress1",                                
    "format_version_id":1                                              
},
  • index_name:倒排索引名字,在查询语句中需要指定索引查询,不能为summary。
  • index_type:索引的类型,必须为PACK。
  • term_payload_flag:是否需要存储term_payload(每个term的payload),1表示存储,0表示不存储(以下的1, 0都表示这个含义),默认不存储。
  • doc_payload_flag:是否需要存储doc_payload(在每篇Document中每个term的payload),默认值不存储。
  • position_list_flag:是否需要存储position信息,默认存储。配置依赖 : term_frequency_flag=1 (只有在配置了term_frequency_flag=1 的情况下, 才可以选择配置position_list_flag=1)。
  • position_payload_flag:是否需要存储position_payload(在每篇Document中的每个位置上的term的payload),默认不存储。配置依赖: position_list_flag=1(只有在配置了 position_list_flag=1 的情况下,才可以配置 position_payload_flag = 1)。
  • term_frequency_flag:是否需要存储term frequency, 默认存储。
  • term_frequency_bitmap:是否需要将term frequency存储为bitmap的形式,默认为0。配置依赖:term_frequency_flag=1 (只有配置了term_frequency_flag=1的情况下,才可以配置 term_frequency_bitmap=1)。
  • has_section_attribute:是否需要存储section_attribute信息,默认为true,配置了section才可以计算文本相关性。
  • section_attribute_config:section_attribute索引配置信息,当has_section_attribute为true时配置生效。配置项has_field_id指定是否存储field_id信息(默认为true),不存储field_id时查询过程将认为所有section归属于index_fields中的第一个field;has_section_weight指定是否存储权重信息(默认为true);compress_type指定section_attribute的压缩配置方法(默认为不压缩),配置方式和多值attribute的compress_type配置项相同。如果没有显示给出section_attribute_config,则内部配置项全部采用默认配置。
  • high_frequency_dictionary:如果配置此项则表示需要建立bitmap索引,此处指定了建立bitmap索引时用到的词表,不需要bitmap索引则可以不配置此项。
  • high_frequency_adaptive_dictionary:如果配置此项则表示需要建立自适应bitmap索引,此处指定了建立自适应bitmap索引的规则名称,不需要建立自适应bitmap索引则可以不配置此项。
  • high_frequency_term_posting_type:如果配置了bitmap索引或者自适应bitmap索引,则可以配置bitmap索引的类型(both/bitmap)。如果配置成both,表示既有bitmap,也有倒排索引。否则只有bitmap信息,默认值是bitmap。
  • index_fields:表示需要进入该index的field,field必须为TEXT类型,而且需要使用相同的分析器。
  • boost:配置建立索引的field的名字以及该field在这个索引中的权重(boost的值)。
  • index_analyzer:配置查询过程中的分词器。如果配置了该分词器,查询过程中就采用该分词器进行分词,此时该分词器可以和field中的分词器不一致。如果不配置该项,则采用field中的分词器,此时要求field中分词器保持一致。注意该分词器只能在field类型为text的索引中添加。
  • file_compress:文件压缩方式(ha3 3.9.1起支持),填写file_compress中的一个压缩别名,可对倒排索引开启文件压缩,可不配,不配即不压缩。
  • format_version_id:指定倒排索引的版本id,默认为0(代表indexlib迁移aios基准版本的倒排格式),可选设置为1( ha【3.9.1】版本引入,支持一系列倒排存储格式优化,包括:短链vByte压缩、newPForDelta压缩算法优化、连续docid区间dictInline存储)

注意事项

  • index_name 不允许命名为"summary"。
  • PACK索引的field必须都为TEXT类型。
  • 在没有为index指定分词器的情况下,配置在同一个索引里的所有field指定的分词器必须一样。
  • 此处配置field的顺序必须与fields中顺序保持一致。
  • 如果同时配置了high_frequency_dictionary和high_frequency_adaptive_dictionary,high_frequency_dictionary中定义的高频词直接生成bitmap索引,不受high_frequency_adaptive_dictionary的规则限制。
  • format_version_id支持对非pk类型的所有倒排开启,离线开启前需要在线升级到支持对应version的版本,否则会加载失败。在线支持新版本的同时可以兼容读取老版本格式。
  • pack索引最多支持32个字段。

TEXT索引

TEXT索引介绍

TEXT索引是单字段索引。用于对TEXT类型的字段建立索引。采用分词器将TEXT切分成多个检索词(term),并对每一个词单独建立倒排链。 可以采用截断,高频词bitmap和tfbitmap的方式提高检索性能

信息名称 df ttf tf fieldmap section信息 position positionpayload docpayload termpayload
是否支持 支持 可选 可选 不支持 不支持 可选 可选 可选 可选

TEXT索引配置示例

{
	"index_name": "text_index",
	"index_type": "TEXT",
	"term_payload_flag" :  1 ,
	"doc_payload_flag" :  1 ,
	"position_payload_flag" : 1,
	"position_list_flag" : 1,
	"term_frequency_flag" : 1,
	"index_fields": "title",
  "file_compress":"simple_compress1"  
}

TEXT索引配置中的index_name,index_type,term_payload_flag,doc_payload_flag,position_payload_flag,position_list_flag,term_frequency_flag, file_compress的含义相同,只是index_type必须为TEXT,并且index_fields只支持一个字段。

注意事项

  • index_name 不允许命名为"summary"。

NUMBER 索引

NUMBER索引介绍

NUMBER索引是单字段索引。用于对整型(INT8、UINT8、INT16、UINT16、INT32、UINT32、INT64、UINT64)数据建立倒排索引。 建立NUMBER索引的字段可以是多值字段,多值字段中的每一个数值都会单独建立倒排链。 NUMBER索引可存储的信息如下:

信息名称 df ttf tf fieldmap section信息 position positionpayload docpayload termpayload
是否支持 支持 可选 可选 不支持 不支持 不支持 不支持 可选 可选

改善NUMBER倒排索引性能的方法如下:

方法名称 描述
截断 可以根据配置,将一些优质文档单独建倒排索引,检索时优先查找该部分索引。减少对不必要文档的检索过程。在主搜中性能提升一倍左右。具体的配置方法参考:集群配置link。
高频词的bitmap 对于常见的高频词,可以采用bitmap索引来存储,减少索引空间大小,提高检索性能。采用bitmap存储高频词只能检索到ttf, df, termpayload, docid信息。用户可以通过设置高频词典和自适应高频词典来设定采用bitmap结构存储高频词
tf bitmap 采用bitmap方式存储每篇doc的tf信息。对于df数大的词,可以采用bitmap的方式存储其tf信息。采用该方式存储无倒排索引信息丢失。

NUMBER索引配置示例

在schema.json文件中,number索引的配置示例如下:

{
	"index_name": "number_index",
	"index_type": "NUMBER",
	"term_payload_flag" :  0,
	"doc_payload_flag" :  0,
	"term_frequency_flag" : 0,
	"index_fields": "number_field",
  "file_compress":"simple_compress1"   
}

NUMBER索引配置中的index_name,index_type,term_payload_flag,doc_payload_flag,term_frequency_flag, file_compress的含义相同,只是index_type必须为NUMBER,并且index_fields只支持一个字段,并且字段的类型必须为整型。

最佳实践:为了减小索引大小,建议将term_payload_flag、doc_payload_flag、term_frequency_flag设置为0。

注意事项

  • index_name 不允许命名为"summary"。
  • 支持对多值整型构建索引,构建索引时每个值都会建独立的倒排索引。

STRING 索引

STRING索引介绍

STRING索引是单字段索引。用于对STRING类型的数据建立倒排索引。STRING字段不采用分词处理,每一个STRING都作为一个单独的索引词建立倒排链。STRING索引的字段允许为多值字段,按照多值分隔符切分,对每个STRING建立倒排。 可以采用截断,高频词bitmap和tfbitmap的方式提高检索性能

信息名称 df ttf tf fieldmap section信息 position positionpayload docpayload termpayload
是否支持 支持 可选 可选 不支持 不支持 不支持 不支持 可选 可选

STRING索引配置示例

{
	"index_name": "string_index",
	"index_type": "STRING",
	"term_payload_flag" :  1,
	"doc_payload_flag" :  1,
	"term_frequency_flag" : 1,
	"index_fields": "user_name",
  "file_compress":"simple_compress1"   
}
  • STRING索引配置中的index_name,index_type,term_payload_flag,doc_payload_flag,term_frequency_flag, file_compress的含义相同,只是index_type必须为STRING,并且index_fields只支持一个字段,并且字段的类型必须为STRING,支持多值整型字段。

最佳实践:为了减小索引大小,建议将term_payload_flag、doc_payload_flag、term_frequency_flag设置为0。

注意事项

  • index_name 不允许命名为"summary"。
  • 支持对多值整型构建索引,构建索引时每个值都会建独立的倒排索引。

PRIMARYKEY64/PRIMARYKEY128 索引

PRIMARYKEY介绍

PRIMARYKEY索引是文档的主键索引,只能配置一个。该索引支持所有类型的字段。该索引可以存储索引字段hash值与docid的映射关系,用于排重使用。用户可以获取每个doc的hash值

信息名称 df ttf tf fieldmap section信息 position positionpayload docpayload termpayload
是否支持 支持 不支持 不支持 不支持 不支持 不支持 不支持 不支持 不支持

PRIMARYKEY配置示例

{
	"index_name": "primary_key_index",
	"index_type" : "PRIMARYKEY64",
	"index_fields": "product_id",
	"has_primary_key_attribute": true,
	"is_primary_key_sorted": true,
  "pk_storage_type" : "sort_array",
  "pk_hash_type" : "default_hash"
}
  • index_name:索引名称。
  • index_type:索引类型,PRIMARYKEY64或者PRIMARYKEY128,64和128表示hash的位数,一般64位就足够了。
  • index_fields:构建索引的字段,只支持一个字段,任何字段类型都可以,建议设置为主键对应的字段。
  • has_primary_key_attribute:primarykey attribute是指doc id到primarykey hash值的映射,如果查询时需要去重或者需要一阶段查询时返回PK的hash值,则必须配置,此选项默认值为false。
  • is_primary_key_sorted是pk索引优化开关,为true时dump出的索引是按pk排好序的,会使加载变快;默认为false
  • pk_storage_type 配置pk的存储方式, 可选 sort_array、 hash_table、block_array。默认sort_array
    • sort_array更省空间,
    • hash_table性能更好
    • block_array支持配置block cache和mmap
  • pk_hash_type配置pk字段计算hash值的对应方法,可选default_hash、murmur_hash和number_hash。默认是default_hash
    • default_hash默认的字符串hash方法
    • murmur_hash采用murmur哈希算法(性能更好)
    • number_hash当pk field为number类型时可以开启,直接用number数值代替hash值(转换性能比hash更快,但是使用原值后对比hash值可能更容易出现簇拥

注意事项

  • PRIMARYKEY64/PRIMARYKEY128索引支持所有类型的field。
  • PRIMARYKEY索引是文档的主键,因此PRIMARYKEY索引至多配置1个。
  • PRIMARYKEY索引不支持空值字段。
  • PRIMARYKEY索引不支持file_compress文件压缩。
  • index_name 不允许命名为"summary"。

DATE索引

DATE索引介绍

日期索引主要用于对时间日期构建索引,用于时间的范围查询。

配置示例

"fileds":
[
    {"field_name":"inputtime",     "field_type":"UINT64", "binary_field": false},
    ...
]
...
"indexs":
[
    {
        "index_name": "inputtime",                                        1
        "index_type" : "DATE",                                            2
        "index_fields": "inputtime",                                      3
        "build_granularity": "minute",                                    4
        "file_compress":"simple_compress1"                                5
    },
    ...
]
  • index_name:倒排索引名字,在查询语句中需要指定索引查询。
  • index_type:索引的类型 DATE。
  • index_fields:表示该index对应的field。 date索引的field_type支持为UINT64/DATE/TIME/TIMESTAMP类型
  • build_granularity:建库的精度, 如果精度为分钟级, 那么数据中的秒以及微妙的值会被忽略掉(视作为0), 查询的时候也只能查询分钟粒度的数据。
  • file_compress:倒排文件压缩,参考PACK倒排。

查询语法

DATE索引的查询语法请参考DATE索引查询语法。

注意事项

  • date索引不支持bitmap。
  • 建库精度一共支持"year", "month", "day", "hour", "minute", "second", "millisecond"7个级别。精度越高(越靠近微秒级)需要的存储空间就越大。
  • DATE/TIME/TIMESTAMP统一按照各自的格式,解析为距离1970-01-01 00:00:00.000的毫秒精度时间戳(GMT/UTC时间戳,不考虑时区)进行倒排索引构建。查询条件也需要依据对应标准进行时间戳范围查询。
  • 查询接口term支持空term方式,查询对应字段(enable_null:true)为空的相关记录
  • index_name 不允许命名为"summary"。

RANGE索引

RANGE索引介绍

range索引对整型数据构建索引,用于查询某一范围的文档,用于替代filter子句中的范围过滤时,性能会有较大的提升(filter过滤掉的文档越多,性能提升越明显)。

配置示例

"fileds":
[
    {"field_name":"price",     "field_type":"INT64", "binary_field": false},
    ...
]
"indexs":
[
    {
        "index_name": "inputtime",
        "index_type" : "RANGE",
        "index_fields": "price",
        "file_compress":"simple_compress1"  
    },
    ...
]

查询语法

RANGE索引的查询语法请参考RANGE查询语法。

注意事项

  • range索引的field_type可以为INT64, INT32, UINT32, INT16, UINT16, INT8, UINT8,不支持多值字段.
  • range索引不支持空值字段。
  • index_name 不允许命名为"summary"。

空间(SPATIAL)索引

空间索引介绍

空间索引对给定点的经纬度构建索引,主要用于地理空间的查询,包括掉点范围查询、线查询、多边形查询等。

配置示例

"fileds":
[
    {"field_name":"location",         "field_type":"LOCATION"},
    {"field_name":"line",     "field_type":"LINE"},
    {"field_name":"polygon",     "field_type":"POLYGON"},
    ...
]
....
"indexs":
[
    {
        "index_name": "inputtime",                                        1
        "index_type" : "SPATIAL",                                         2
        "index_fields": "location",                                       3
	    	"max_search_dist": 10000,                                         4
	    	"max_dist_err": 20                                                5
	    	"distance_loss_accuracy":0.025,                                   6
        "file_compress":"simple_compress1"                                7
    },
    ...
]
  • index_name:倒排索引名字,在查询语句中需要指定索引查询。
  • index_type:索引的类型,必须为SPATIAL。
  • index_fields:表示该index对应的field,字段的类型需要为LOCATION、LINE、POLYGON。
    • LOCATION字段示例:location=LON LAT,如location=116 40
    • LINE:line=location,location,location...^]location,location...,如line=116 40,117 41,118 42^]...。如果是通过引擎sdk推送数据,LINE字段的格式为line : ["location,location,location...", "location,location,location..."]
    • POLYGON字段示例:polygon=location1,location2,...location1^]...,如果是通过引擎sdk推送数据,POLYGON字段的格式为line : ["location,location,location",...]。多边形可以是凸多边形或凹多边形;多边形起止点需要保证一致;相邻的两条边不能共线;多边形的边不允许自相交。
  • max_search_dist:指定查询时最大的查询覆盖距离(直径),单位米。必须大于max_dist_err。
  • max_dist_err:指定建库时最大距离误差(直径),单位米。最小值为0.05米
  • distance_loss_accuracy:引擎以精度损失为代价优化折线和多边形查询性能。具体方法是:折线或多边形外接矩形的对角线长度*distance_loss_accuracy 作为最高层的距离范围。默认是0.025。
  • 文件压缩方式,参考PACK倒排。

查询语法

空间索引的查询语法请参考空间索引查询语法。

注意事项

  • 线和多边形的点坐标会映射到平面展开的世界地图上,以此确定线和多边形范围,不考虑跨180度经线的情况。location倒排的查询结果是精确的。line和polygon倒排的查询结果需要进行过滤。
  • index_name 不允许命名为"summary"。
Clone this wiki locally