文档
ElasticSearch是面向文档的,文档是所有可搜索数据的最小单元,文档会被序列化成JSON格式保存在ElasticSearch中,JSON文档格式灵活,不需要预先定义格式。
字段类型
JSON中的每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型),可以指定或者自动推算。每个文档都有一个Unique ID,可以自己指定或者自动生成。
每个字段都有字段数据类型或者字段。此类指示字段包含的数据类型,比如strings或者boolean值和它的预期用途。例如,您可以将strings索引到text和keyword字段。但是text字段值会被进行全文搜索分析,同时keyword strings是被保留进行过滤和排序。
字段类型按family进行分组。同一系列中的类型支持相同的搜索功能,但是可能具有不同的空间使用和性能特征。
目前,唯一的类型family是keyword。它由keyword、constant_keyword和wildcard字段类型组成。其他类型family只有一个字段类型。比如,boolean类型family由一个字段类型组成:boolean。
常见类型
-
binary:编码为Base64字符串的二进制值。
-
boolean:true和false值
-
Keywords:keywords family,包括keyword、constant_keyword和wildcard。 keyword族包含以下字段类型:
- keyword,用于结构化内容,例如IDs、电子邮件地址、主机名、状态代码、邮政编码或者标签。
constant_keyword,对于始终包含相同值的keyword字段。wildcard,用于非结构化机器生成的内容。wildcard类型对具有大值或高基数的字段进行了优化。
Keyword字段常用于sorting,aggregations和term-level queries,例如
term。 -
Numbers:数字类型,例如long和double,用于表示数量。
-
Dates:日期类型,包含
date和date_nanos。 -
alias:为现有字段定义别名。 在索引中alias映射定义一个字段的备用名称,在搜索请求中alias可以被使用代替目标字段,并选择其他APIs如field capabilities。
PUT trips
{
"mappings": {
"properties": {
"distance": {
"type": "long"
},
"route_length_miles": {
"type": "alias",
"path": "distance"
},
"transit_mode": {
"type": "keyword"
}
}
}
}
GET _search
{
"query": {
"range" : {
"route_length_miles" : {
"gte" : 39
}
}
}
}
对象和关系类型
object:一个JSON对象。
PUT my-index-000001/_doc/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
PUT my-index-000001
{
"mappings": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": { "type": "integer" },
"name": {
"properties": {
"first": { "type": "text" },
"last": { "type": "text" }
}
}
}
}
}
}
}
flattened:作为单个字段值的整个 JSON 对象。
默认情况下,对象中的每个子字段都单独映射和索引。如果事先不知道子字段的名称或者类型,则会mapped dynamically它们。
flattened类型提供了另一种方法,其中整个对象是被映射为单字段。给定一个对象,flattened映射将解析出它的叶值并作为keywords索引它们到一个字段中。对象的内容可以通过简单的查询和聚合来搜索。
nested:保留其子字段之间关系的JSON对象。
nested类型是
object数据类型的特殊版本,它允许以一种可以彼此独立查询的方式对对象数组进行索引。
join:为同一索引中的文档定义父/子关系。
join数据类型是一个在文档中创建父/子关系的特殊字段。relations部分定义了文档中一组可能关系,每个关系都是一个父名称和一个子名称。
有点像关系型数据定义的parent_id字段
结构化数据类型
- Range:范围类型,例如
long_range、double_range、date_range和ip_range。
新建索引和插入一个文档:
PUT range_index
{
"settings": {
"number_of_shards": 2
},
"mappings": {
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
PUT range_index/_doc/1?refresh
{
"expected_attendees" : {
"gte" : 10,
"lt" : 20
},
"time_frame" : {
"gte" : "2015-10-31 12:00:00",
"lte" : "2015-11-01"
}
}
查询:
GET range_index/_search
{
"query" : {
"range" : {
"time_frame" : {
"gte" : "2015-10-31",
"lte" : "2015-11-01",
"relation" : "within"
}
}
}
结果:
{
"took": 13,
"timed_out": false,
"_shards" : {
"total": 2,
"successful": 2,
"skipped" : 0,
"failed": 0
},
"hits" : {
"total" : {
"value": 1,
"relation": "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "range_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"expected_attendees" : {
"gte" : 10, "lt" : 20
},
"time_frame" : {
"gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
}
}
}
]
}
}
version字段类型是keyword字段的专门化,用于处理软件版本值并支持专门优先级规则。优先级是根据Semantic Versioning概述的规则进行定义的,例如,这意味着主,次和补丁版本部分是按数字排序(即。"2.1.0" < "2.4.1" < "2.11.2")和预发布版本是排序在发布版本之前(即。"1.0.0-alpha" < "1.0.0")。
如下:
PUT my-index-000001
{
"mappings": {
"properties": {
"my_version": {
"type": "version"
}
}
}
}
- murmur3:计算和存储散列值。
聚合数据类型
- aggregate_metric_double:预先聚合的指标值。
存储metric aggregations的预聚合数值。aggregate_metric_double字段是一个包含min, max, sum, 和 value_count meric子字段的对象。
- histogram:直方图形式的预聚合数值。
文本搜索类型
-
text字段: 文本family,包括text和match_only_text。经过分析的非结构化文本。
- text:全文内容的传统字段类型,例如电子文件正文或产品描述。
match_only_text:一种空间优化的变体,它禁用评分并且在需要定位的查询上执行缓慢。它最适合索引日志消息。
-
annotated-text 包含特殊标记的文本,用于识别命名实体。
-
completion:用于自动完成建议。
completion建议提供自动完成/边打字边搜索的功能。这是一个导航功能,用于在用户打字时引导用户达到相关结果,从而提高搜索精度。它并不意味着拼写纠正或你的意思功能,如术语或短语提示。
-
search_as_you_type:
text-like 类型,用于按您的键入完成。Search-as-you-type 字段类型是一个text-like字段,经过优化提供给开箱即用的键入完成时的查询。它创建一系列子字段,这些子字段被分析为索引项,可以通过部分匹配整个索引文本值的查询来有效匹配这些索引项。支持前缀完成(即匹配输入开头的词)和中缀完成(即在输入内的任何位置匹配词)。
-
token_count:文本中的token计数。
token_count字段类型实际上是一个
integer字段接受字符串值,分析它们,然后索引字符串中的tokens数目。
PUT my-index-000001
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"length": {
# name.length字段是一个token_count multi-filed,它将索引name字段中的token数。
"type": "token_count",
"analyzer": "standard"
}
}
}
}
}
}
PUT my-index-000001/_doc/1
{ "name": "John Smith" }
PUT my-index-000001/_doc/2
{ "name": "Rachel Alice Williams" }
GET my-index-000001/_search
{
"query": {
"term": {
# 这个查询仅匹配包含Rachel Alice Williams的文档,因为它有三个tokends。
"name.length": 3
}
}
}
文档排名类型
-
dense_vector:记录浮点值的密集向量dense_vector字段存储浮点值的密集向量。向量中可以包含的最大维数不应超过2048。dense_vector字段是单值字段。 dense_vector字段不支持查询、排序或聚合。 它们只能通过专用向量函数在脚本中访问。
你将索引密集向量为浮点数组。
PUT my-index-000001 { "mappings": { "properties": { "my_vector": { "type": "dense_vector", // 3维 "dims": 3 }, "my_text" : { "type" : "keyword" } } } } PUT my-index-000001/_doc/1 { "my_text" : "text1", "my_vector" : [0.5, 10, 6] } PUT my-index-000001/_doc/2 { "my_text" : "text2", "my_vector" : [-0.5, 10, 10] } -
sparse_vector:记录浮点值的稀疏向量。
Deprecated in 7.6.
-
rank_feature:记录数字特征以提高查询时的命中率。rank_feature字段可以索引数字,以便他们以后在rank_feature查询中增强。
PUT my-index-000001 { "mappings": { "properties": { "pagerank": { # 排名特征字段必须使用`rank_feature`字段类型 "type": "rank_feature" }, "url_length": { "type": "rank_feature", # 与分数负相关的排名特征需要声明它 "positive_score_impact": false } } } } PUT my-index-000001/_doc/1 { "pagerank": 8, "url_length": 22 } GET my-index-000001/_search { "query": { "rank_feature": { "field": "pagerank" } } } -
rank_features:记录数字特征以提高查询时的命中率。rank_features字段可以索引数字特征向量,以便他们以后在rank_feature查询中增强。
类似于
rank_feature数据类型,但更适用于特征列表稀疏的情况,因此向每个特征的映射添加一个字段是不合理的。PUT my-index-000001 { "mappings": { "properties": { "topics": { "type": "rank_features" }, "negative_reviews" : { "type": "rank_features", "positive_score_impact": false } } } } PUT my-index-000001/_doc/1 { "topics": { "politics": 20, "economics": 50.8 }, "negative_reviews": { "1star": 10, "2star": 100 } } PUT my-index-000001/_doc/2 { "topics": { "politics": 5.2, "sports": 80.1 }, "negative_reviews": { "1star": 1, "2star": 10 } } GET my-index-000001/_search { "query": { "rank_feature": { "field": "topics.politics" } } } GET my-index-000001/_search { "query": { "rank_feature": { "field": "negative_reviews.1star" } } }
空间数据类型
其他类型
-
percolator:用Query DSL编写的索引查询。
percolator字段类型解析json结构为本地查询并存储该查询,以便percolate query可以使用它来匹配提供的文档。
把查询条件记录下来,给后面使用
数组
在 Elasticsearch 中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值必须属于相同的字段类型。请参阅数组。
多字段
为不同的目的以不同的方式索引同一个字段通常非常有用。例如,string字段可以映射为text字段用于全文搜索,也可以映射为keyword字段用于排序或聚合。或者你可以索引一个text字段使用standard analyzer,english analyzer,和french analyzer。
这就是multi-fields的目的。大部分字段类型支持多字段通过fields参数。
元数据
每个文档都有与之关联的元数据,例如_index,映射 _type,和_id元数据。创建映射类型时,可以自定义其中一些元数据字段的行为。
身份元数据字段
文档源元数据字段
_source:表示文档正文的原始 JSON。- _size:_source字段的字节大小,由mapper-size plugin提供。
文档计数元数据字段
_doc_count:当文档表示预聚合数据时,用于存储文档数的常规字段。
索引元数据字段
_field_names:文档中包含非空值的所有字段。_ignored:文档中由于ignore_malformed而在索引时被忽略的所有字段。
路由元数据
_routing:将文档路由到特定分片的自定义路由值。
其他元数据
索引
类比于MySQL如下:
- MySQL => Databases => Tables => Columns/Rows
- Elasticsearch => Indices => Types(Index) => Documents with Properties
创建索引
创建新索引。
PUT /my-index-000001
请求
PUT /<index>
描述
你可以使用创建索引API将索引添加至Elasticsearch集群中。创建索引时,您可以指定以下内容:
- 索引设置
- 索引中的字段映射
- 索引别名
路径参数
<index>:(必须,字符串) 你要创建索引的名字。
索引名称必须满足以下条件:
- 仅小写
- 不能包括``,
/,*,?,",<,>,|,(空格字符),,,# - 7.0 之前的索引可以包含冒号 (
:),但已弃用并且在 7.0+ 中不再受支持 - 不能以
-,_,+ - 不能是
.或.. - 不能超过 255 个字节(注意它是字节,所以多字节字符将更快地计入 255 个限制)
- 以
.开头的名称已弃用,除隐藏索引和插件管理的内部索引之外
查询参数
- wait_for_active_shards:(可选,String)在继续操作之前必须处于活动状态的分片副本数。设置为
all或任何正整数,最多为索引中分片的总数 (number_of_replicas+1)。默认值:1,主分片。 - master_timeout:(可选,time units)等待连接到主节点的时间。如果在超时到期之前未收到响应,则请求失败并返回错误。默认为30s。
- timeout:(可选,time units)等待响应时间。如果在超时到期之前未收到响应,则请求失败并返回错误。默认为30s。
请求正文
aliases:(可选,对象的对象)索引的别名。
-
aliases对象的属性-
<alias>(Required, object) 键是别名。索引别名支持 date math。
对象主体包含别名的选项。支持空对象。
属性
<alias>-
filter(可选,查询 DSL 对象)用于限制别名可以访问的文档的查询。
-
index_routing(可选,字符串)用于将索引操作路由到特定分片的值。如果指定,这将覆盖
routing索引操作的值。 -
is_hidden(可选,布尔值)如果
true,则隐藏别名。默认为false. alias的所有indices必须具有相同的is_hidden值。 -
is_write_index(可选,布尔值)如果
true,别名指向的索引是write index。默认为false. -
routing(可选,字符串)用于将索引和搜索操作路由到特定分片的值。
-
search_routing(可选,字符串)用于将搜索操作路由到特定分片的值。如果指定,这将覆盖
routing搜索操作的值。
-
-
-
mappings(可选,mapping对象)索引中字段的映射。如果指定,此映射可以包括:
请参阅映射。
PUT /test
{
"aliases": {
"alias_1": {},
"alias_2": {
"filter": {
"term": { "user.id": "kimchy" }
},
"routing": "shard-1"
}
},
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"field1": { "type": "text" }
}
}
}
基本api使用
查看索引相关信息
GET index
查看索引文档总数
GET index/_count
_cat/indices
# 模糊查找名为kiban的索引
GET /_cat/indices/*kibana*?v&s=index
# 查看状态为绿的索引
GET /_cat/indices?v&health=green
# 按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc
# 查看具体的字段
GET /_cat/indices/movies?pri&v&h=health,index,pri,rep,docs.count,mt
# 查看每个索引的内存
GET /_cat/indices?v&h=i,tm&s=tm:desc
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情