0.入门
简单安装
下载对应版本的软件包后
cd elasticsearch-<version>
./bin/elasticticsearch
- 如果你想把 Elasticsearch 作为一个守护进程在后台运行,那么可以在后面添加参数
-d
。 - 如果你是在 Windows 上面运行 Elasticseach,你应该运行 bin\elasticsearch.bat 而不是 bin\elasticsearch 。
- 测试 Elasticsearch 是否启动成功,可以打开另一个终端,执行以下操作:
curl 'http://localhost:9200/?pretty'
或浏览器打开
http://localhost:9200/?pretty
结果如下
{
"name" : "9333T0D",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "zHPKwfphSmqah0eNiRiH1Q",
"version" : {
"number" : "6.2.2",
"build_hash" : "10b1edd",
"build_date" : "2018-02-16T19:01:30.685723Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
1.索引
对象说明
索引(数据库)→类型(表)→文档(行)→属性(字段)
创建一个索引
curl -XPUT 'localhost:9200/megacorp?pretty'
或
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp?pretty'(5.5以后版本)
返回信息
{
"acknowledged" : true,
"shards_acknowledged" : true
}
列出所有索引
API:_cat
curl -XGET -H 'Content-Type: application/json' 'localhost:9200/_cat/indices?v'
返回信息
health | status | index | uuid | pri | rep | docs.count | docs.deleted | store.size | pri.store.size |
---|---|---|---|---|---|---|---|---|---|
yellow | open | customer | SRKYMKC1SVSTfCOSAbGqzQ | 5 | 1 | 6 | 0 | 20.3kb | 20.3kb |
v:显示列头
删除索引
curl -XDELETE 'localhost:9200/megacorp?pretty'
返回信息
{
"acknowledged" : true
}
2.类型和文档
创建文档
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/1' -d '
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}'
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/2' -d '
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}'
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/3' -d '
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}'
显式创建文档
curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4?op_type=create' -d '
{
"first_name" : "Jack",
"last_name" : "Kobe",
"age" : 44,
"about": "I like to play basketball",
"interests": [ "sport" ]
}'
或者
curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4/_create' -d '
{
"first_name" : "Jack",
"last_name" : "Kobe",
"age" : 44,
"about": "I like to play basketball",
"interests": [ "sport" ]
}'
创建成功状态码是201,已存在的状态码是409
索引数据后的返回返回信息
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no":0
"_primary_term":1
}
- 创建文档时:_index 、 _type 和 _id 的组合可以唯一标识一个文档。
- 文档的元数据说明
_index:文档在哪存放
_type:文档表示的对象类别
_id:文档唯一标识
_version:版本号;当每次对文档进行修改时(包括删除), _version 的值会递增;处理冲突时也会用到。
自动生成ID:请求的结构调整为: 不再使用 PUT 谓词(“使用这个 URL 存储这个文档”), 而是使用 POST 谓词(“存储文档在这个 URL 命名空间下”)。
检索文档
普通检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1'
轻量检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search'
检索部分内容
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1?_source=first_name,last_name'
只得到source的内容
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1?_source'
按条件搜索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?q=last_name:Smith'
*q=表示匹配全部文档
sort=age表示按照age信息排序
asc表示升序
可以不加参数,查询全部文档
curl -XGET 'localhost:9200/megacorp/_search?pretty'
返回信息说明
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : null,
"hits" : [
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_score" : null,
"_source" : {
"name" : "Zhao1"
},
"sort" : [
9223372036854775807
]
}
]
}
}
使用检索表达式
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}'
复杂检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}'
批量检索(multi-get 或者 mget API)
mget API 要求有一个 docs 数组作为参数,每个 元素包含需要检索文档的元数据, 包括 _index 、 _type 和 _id 。如果你想检索一个或者多个特定的字段,那么你可以通过 _source 参数来指定这些字段的名字:
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_mget?pretty' -d '
{
"docs" : [
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : 2
},
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : 1
}
]
}'
如果想检索的数据都在相同的 _index 中(甚至相同的 _type 中),则可以在 URL 中指定默认的 /_index 或者默认的 /_index/_type 。
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/_mget' -d '
{
"docs" : [
{ "_id" : 2 },
{ "_type" : "employee", "_id" : 1 }
]
}'
也可以用ids来检索数据
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/_mget' -d '
{
"ids" : [ "2", "1" ]
}'
全文检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
短语检索
我们想执行这样一个查询,仅匹配同时包含 “rock” 和 “climbing” ,并且 二者以短语 “rock climbing” 的形式紧挨着的雇员记录
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}'
高亮检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}'
- took:查询消耗的毫秒数
- timed_out:查询是否超时
- _shards:查询了多少个分片,以及成功/失败数的统计
- hits:查询结果
- hits.total:符合条件的文档总数
- hits.hits:存储搜索结果的实际数据(默认显示前10个文档)
- sort:排序关键字(如果查询时未制定,默认使用score信息)
- _score:
更新一个文档
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/2/_update' -d '
{
"script" : "ctx._source.age += 5"
}'
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/2/_update' -d '
{
"doc": { "first_name": "Jane Li" }
}'
合并修改
curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1/_update' -d '
{
"script" : "ctx._source.tags+=new_tag",
"params" : {
"new_tag" : "search"
}
}'
要更新的数据不存在时,就创建
curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1/_update' -d '
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 1
}
}'
当因为版本号,并发更新失败时可以重试(retry_on_conflict 设置重试次数)
curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1/_update?retry_on_conflict=5' -d '
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 0
}
}'
乐观锁问题
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/2?version=5&version_type=external'
文档是否存在
curl -i -XHEAD -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4'
删除文档
curl -XDELETE -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4'
成功返回200,找不到是404,version会加1(即使文档不存在(Found 是 false),_version 值仍然会增加。这是 Elasticsearch 内部记录本的一部分,用来确保这些改变在跨多节点时以正确的顺序执行)
删除全部文档
curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_delete_by_query?conflicts=proceed' -d '
{
"query": {
"match_all": {}
}
}'
批量操作(bulk)
与 mget 可以使我们一次取回多个文档同样的方式, bulk API 允许在单个步骤中进行多次 create 、 index 、 update 或 delete 请求。 如果你需要索引一个数据流比如日志事件,它可以排队和索引数百或数千批次。
格式说明:
这种格式类似一个有效的单行 JSON 文档 流 ,它通过换行符(\n)连接到一起。注意两个要点:
每行一定要以换行符(\n)结尾, 包括最后一行 。这些换行符被用作一个标记,可以有效分隔行。
这些行不能包含未转义的换行符,因为他们将会对解析造成干扰。这意味着这个 JSON 不 能使用 pretty 参数打印。
例子
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
action/metadata:指定哪一个文档做什么操作。
action:必须是以下选项之一
create:如果文档不存在,那么就创建它。
index:创建一个新文档或者替换一个现有的文档。
update:部分更新一个文档。
delete“删除一个文档。
metadata 应该 指定被索引、创建、更新或者删除的文档的 _index 、 _type 和 _id 。
curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/_mget?pretty' -d '
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
'
delete后面不需要请求体,最后一行也要有换行
每个子请求都是独立执行,因此某个子请求的失败不会对其他子请求的成功与否造成影响。 如果其中任何子请求失败,最顶层的 error 标志被设置为 true ,并且在相应的请求报告出错误明细。
3.聚合与分析
分析:先开启fielddata
curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/_mapping/employee?pretty' -d '
{
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}'
分析-执行查询
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}'
分析-加入查询条件
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}'
分析-分级汇总
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"aggs" : {
"all_interests" : {
"terms" : { "field" : "interests" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}'