norms参数
norms参数会存储各种normalization因子用于查询时计算文档相对查询字段的相关分;
norms虽然对于相关分计算有帮助,但需要额外的磁盘空间进行存储(一般每个文档的每个字段会额外占用一个字节的空间,即使该字段没有值也同样需要一字节空间),故而如果没有针对特定字段计算分数的必要,可以将该字段置为false,特别是针对只用于排序或聚合的字段;
norms可以针对已存在值的字段进行设置,不过在禁用之后将不可再重新启用;
PUT param_norms_index
{
"mappings": {
"properties": {
"desc":{
"type": "text",
"norms":false
}
}
}
}
//报错,不允许将禁用的再重新启用,Mapper for [desc] conflicts with existing mapping:\n[mapper [desc] has different [norms] values, cannot change from disable to enabled]
PUT param_norms_index/_mapping
{
"properties":{
"desc":{
"type":"text",
"norms":true
}
}
}
norms在禁用之后不会立即删除,不过随着文档的增加,旧段合并到新段,这些norms参数才被移除;由于某些文档不再有norms参数,这可能导致在前后针对相同的文档计算分数存在不一致的情况;
null_value参数
null值在es中是不可建立索引和查询,一个字段设为null(空数组或者值为null的数组)将被视为该字段没有值;
null_value参数允许显式指定值为null时字段的默认值以使字段可以建立索引及可被查询;
需要注意的是指定的null_value的值需要与字段类型一致,否则将会报异常;
null_value只会影响字段为null时的索引,不会改定_source的json值;
//定义create_time字段且定义其null_value
PUT param_null_value_index
{
"mappings": {
"properties": {
"create_time":{
"type": "date",
"null_value": "2020-05-30"
}
}
}
}
//create_time字段不会被替换为null_value值
PUT param_null_value_index/_doc/1
{
"create_time":"2021-01-01"
}
//create_time字段不会被替换为null_value值
PUT param_null_value_index/_doc/2
{
"desc":"day day up"
}
//create_time字段将被替换为null_value值
PUT param_null_value_index/_doc/3
{
"desc":"历史记录",
"create_time":null
}
//create_time字段不会被替换为null_value值
PUT param_null_value_index/_doc/4
{
"desc":"历史记录1",
"create_time":[]
}
//create_time字段将被替换为null_value值
PUT param_null_value_index/_doc/5
{
"desc":"历史记录2",
"create_time":[null,null]
}
GET param_null_value_index/_search
{
"query": {
"range": {
"create_time": {
"gte": "2020-05-10",
"lte": "2021-05-10"
}
}
}
}
查询结果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "param_null_value_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"create_time" : "2021-01-01"
}
},
{