-
Notifications
You must be signed in to change notification settings - Fork 302
倒排索引类型
PACK索引是多字段索引。对TEXT类型的字段建立索引。与TEXT索引相比,该索引将多个TEXT字段合并,建立一个索引,共同检索;该索引还可存储段落信息,用于查询每一个检索词所在的段落及相关信息。 可以采用截断,高频词bitmap和tfbitmap的方式提高检索性能 .
信息名称 | df | ttf | tf | fieldmap | section信息 | position | positionpayload | docpayload | termpayload |
---|---|---|---|---|---|---|---|---|---|
是否支持 | 支持 | 可选 | 可选 | 不支持 | 可选 | 可选 | 可选 | 可选 | 可选 |
{
"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切分成多个检索词(term),并对每一个词单独建立倒排链。 可以采用截断,高频词bitmap和tfbitmap的方式提高检索性能
信息名称 | df | ttf | tf | fieldmap | section信息 | position | positionpayload | docpayload | termpayload |
---|---|---|---|---|---|---|---|---|---|
是否支持 | 支持 | 可选 | 可选 | 不支持 | 不支持 | 可选 | 可选 | 可选 | 可选 |
{
"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索引是单字段索引。用于对整型(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信息。采用该方式存储无倒排索引信息丢失。 |
在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建立倒排。 可以采用截断,高频词bitmap和tfbitmap的方式提高检索性能
信息名称 | df | ttf | tf | fieldmap | section信息 | position | positionpayload | docpayload | termpayload |
---|---|---|---|---|---|---|---|---|---|
是否支持 | 支持 | 可选 | 可选 | 不支持 | 不支持 | 不支持 | 不支持 | 可选 | 可选 |
{
"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"。
- 支持对多值整型构建索引,构建索引时每个值都会建独立的倒排索引。
PRIMARYKEY索引是文档的主键索引,只能配置一个。该索引支持所有类型的字段。该索引可以存储索引字段hash值与docid的映射关系,用于排重使用。用户可以获取每个doc的hash值
信息名称 | df | ttf | tf | fieldmap | section信息 | position | positionpayload | docpayload | termpayload |
---|---|---|---|---|---|---|---|---|---|
是否支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
{
"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"。
日期索引主要用于对时间日期构建索引,用于时间的范围查询。
"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索引对整型数据构建索引,用于查询某一范围的文档,用于替代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"。
空间索引对给定点的经纬度构建索引,主要用于地理空间的查询,包括掉点范围查询、线查询、多边形查询等。
"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"。