ElasticSearch学习(二)-Document

本文详细介绍了ElasticSearch中的Document概念,包括文档由JSON对象组成,字段类型如text、keyword、number等,以及元数据如_meta、_all、_field_names等。强调了不同字段类型的应用场景和特性,例如text类型用于全文搜索,keyword类型适用于过滤和排序。同时,文中还提及了如何设置和查询这些字段。
摘要由CSDN通过智能技术生成
常见术语

文档 Document:用户存储到es中的数据文档。类比数据库中表中的一条数据,是es中的最小单元。

索引 Index:由具有相同字段的文档列表组成。类比数据库中的表。

Document

Document 由 json Object 组成。每个字段可以指定类型。每个Document还包含元数据。

字段类型Field type
字段类型概述
一级分类	二级分类	具体类型
核心类型	字符串类型	text,keyword
整数类型	integer,long,short,byte
浮点类型	double,float,half_float,scaled_float
逻辑类型	boolean
日期类型	date
范围类型	range
二进制类型	binary
复合类型	数组类型	array
对象类型	object
嵌套类型	nested
地理类型	地理坐标类型	geo_point
地理地图	geo_shape
特殊类型	IP类型	ip
范围类型	completion
令牌计数类型	token_count
附件类型	attachment
抽取类型	percolator

text类型

当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合(termsAggregation除外)。

把full_name字段设为text类型的Mapping如下:

PUT my_index
{
   
  "mappings": {
   
    "my_type": {
   
      "properties": {
   
        "full_name": {
   
          "type":  "text"
        }
      }
    }
  }
}

keyword类型

keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到。

数字类型

对于数字类型,ELasticsearch支持以下几种。

类型 取值范围
long -263至263-1
integer -231至231-1
short -32,768至32768
byte -128至127
double 64位双精度IEEE 754浮点类型
float 32位单精度IEEE 754浮点类型
half_float 16位半精度IEEE 754浮点类型
scaled_float 缩放类型的的浮点数(比如价格只需要精确到分,price为57.34的字段缩放因子为100,存起来就是5734)

对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。

对于数字类型的数据,选择以上数据类型的注意事项:

  1. 在满足需求的情况下,尽可能选择范围小的数据类型。比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。字段的长度越短,索引和搜索的效率越高。
  2. 优先考虑使用带缩放因子的浮点类型。

例子:

PUT my_index
{
   
  "mappings": {
   
    "my_type": {
   
      "properties": {
   
        "number_of_bytes": {
   
          "type": "integer"
        },
        "time_in_seconds": {
   
          "type": "float"
        },
        "price": {
   
          "type": "scaled_float",
          "scaling_factor": 100
        }
      }
    }
  }
}

Object类型

JSON天生具有层级关系,文档会包含嵌套的对象:

PUT my_index/my_type/1
{
    
  "region": "US",
  "manager": {
    
    "age":     30,
    "name": {
    
      "first": "John",
      "last":  "Smith"
    }
  }
}

上面的文档中,整体是一个JSON,JSON中包含一个manager,manager又包含一个name。最终,文档会被索引成一平的key-value对:

{
   
  "region":             "US",
  "manager.age":        30,
  "manager.name.first": "John",
  "manager.name.last":  "Smith"

上面文档结构的Mapping如下:

PUT my_index
{
   
  "mappings": {
   
    "my_type": {
    
      "properties": {
   
        "region": {
   
          "type": "keyword"
        },
        "manager": {
    
          "properties": {
   
            "age":  {
    "type": "integer" },
            "name": {
    
              "properties": {
   
                "first": {
    "type": "text" },
                "last":  {
    "type": "text" }
              }
            }
          }
        }
      }
    }
  }
}

date类型

JSON中没有日期类型,所以在ELasticsearch中,日期类型可以是以下几种:

日期格式的字符串:e.g. “2015-01-01” or “2015/01/01 12:10:30”.

  1. long类型的毫秒数( milliseconds-since-the-epoch)
  2. integer的秒数(seconds-since-the-epoch)
  3. 日期格式可以自定义,如果没有自定义,默认格式如下:

日期格式可以自定义,如果没有自定义,默认格式如下:

"strict_date_optional_time||epoch_millis"

例子:

PUT my_index
{
   
  "mappings": {
   
    "my_type": {
   
      "properties": {
   
        "date": {
   
          "type": "date" 
        }
      }
    }
  }
}
 
PUT my_index/my_type/1
{
    "date": "2015-01-01" } 
 
PUT my_index/my_type/2
{
    "date": "2015-01-01T12:10:30Z" } 
 
PUT my_index/my_type/3
{
    "date": 1420070400001 } 
 
GET my_index/_search
{
   
  "sort": {
    "date": "asc"} 
}

查看三个日期类型:

{
   
  "took": 0,
  "timed_out": false,
  "_shards": {
   
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
   
    "total": 3,
    "max_score": 1,
    "hits": [
      {
   
        "_index": "my_index",
        "_type": "my_type",
        "_id": "2",
        "_score": 1,
        "_source": {
   
          "date": "2015-01-01T12:10:30Z"
        }
      },
      {
   
        "_index": "my_index",
        "_type": "my_type",
        "_id": "1",
        "_score": 1,
        "_source": {
   
          "date": "2015-01-01"
        }
      },
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值