Elasticsearch学习笔记(入个门)
7.2.0版本
Elasticsearch安装启动
单实例
跟大部分开源产品一样,下载一个压缩包,解压缩就可用了。
解压后的文件目录说明
启动
bin/elasticsearch -E node.name=node1 -E cluster.name=ljktest -E path.data=node1_data
验证
浏览器输入localhost:9200
{
"name": "node1",
"cluster_name": "ljktest",
"cluster_uuid": "iX1RgTXYRUWIqe9CucwQrA",
"version": {
"number": "7.2.0",
"build_flavor": "default",
"build_type": "tar",
"build_hash": "508c38a",
"build_date": "2019-06-20T15:54:18.811730Z",
"build_snapshot": false,
"lucene_version": "8.0.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
到此安装成功了
安装插件icu
bin/elasticsearch-plugin install analysis-icu
查看安装插件
bin/elasticsearch-plugin list
多实例集群
bin/elasticsearch -E node.name=node1 -E cluster.name=ljktest -E path.data=node1_data -d
bin/elasticsearch -E node.name=node2 -E cluster.name=ljktest -E path.data=node2_data -d
bin/elasticsearch -E node.name=node3 -E cluster.name=ljktest -E path.data=node3_data -d
查看集群节点信息
http://localhost:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 34 100 48 4.22 mdi - node3
127.0.0.1 26 100 27 4.22 mdi * node1
127.0.0.1 23 100 27 4.22 mdi - node2
使用RestApi与集群交互
你能够通过API做到
- 检查群集,节点和索引运行状况,状态和统计信息
- 管理您的群集,节点和索引数据和元数据
- 对索引执行CRUD(创建,读取,更新和删除)和搜索操作
- 执行高级搜索操作,例如分页,排序,过滤,脚本编写,聚合等等
集群健康状态检查
GET /_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1563931882 01:31:22 ljktest green 2 2 4 2 0 0 0 0 - 100.0%
集群健康表示为三个颜色,分别为绿色、黄色、红色。
- 绿色 - 一切都很好(集群功能齐全)
- 黄色 - 所有数据都可用,但尚未分配一些副本(群集功能齐全)
- 红色 - 某些数据由于某种原因不可用(群集部分功能)
注意:当群集为红色时,它将继续提供来自可用分片的搜索请求,但您可能需要尽快修复它,因为存在未分配的分片。
列出所有索引
GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_task_manager VzO_iN_ZS1qfEIcAdppCtQ 1 1 2 0 25.5kb 12.7kb
green open .kibana_1 HC1uWncjT_qYh2oX_cqk7g 1 1 4 0 30.8kb 15.4kb
创建一个索引
PUT /customer?pretty
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "customer"
}
给索引添加文档
PUT /customer/_doc/1?pretty
{
"name": "John Doe"
}
{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
注意:Elasticsearch不需要在将文档编入索引之前先显式创建索引。在前面的示例中,如果客户索引事先尚未存在,则Elasticsearch将自动创建客户索引。
查询文档
GET /customer/_doc/1?pretty
{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"name": "John Doe"
}
}
除了字段之外,没有任何异常,发现,声明我们找到了一个具有请求ID 1的文档和另一个字段_source,它返回我们从上一步索引的完整JSON文档。
删除索引
DELETE /customer?pretty
{
"acknowledged": true
}
修改文档
PUT /customer/_doc/1?pretty
{
"name": "John Doe"
}
改变ID1文档的name属性
PUT /customer/_doc/1?pretty
{
"name": "Jane Doe"
}
增加一个ID2的文档
PUT /customer/_doc/2?pretty
{
"name": "Jane Doe"
}
索引时,ID部分是可选的。如果未指定,Elasticsearch将生成随机ID,然后使用它来索引文档。Elasticsearch生成的实际ID(或前面示例中显式指定的内容)将作为索引API调用的一部分返回。
POST /customer/_doc?pretty
{
"name": "Jane Doe"
}
{
"_index": "customer",
"_type": "_doc",
"_id": "tUsLImwBpPtD8mF4h9JJ",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
更新文档
除了能够索引和替换文档,我们还可以更新文档。请注意,Elasticsearch实际上并没有在引擎盖下进行就地更新。每当我们进行更新时,Elasticsearch都会删除旧文档,然后一次性对应用了更新的新文档编制索引。
- 更改名称
POST /customer/_update/1?pretty
{
"doc": { "name": "Jane Doe" }
}
- 增加年龄
POST /customer/_update/1?pretty
{
"doc": { "name": "Jane Doe", "age": 20 }
}
- 使用脚本更新年龄+5
POST /customer/_update/1?pretty
{
"script" : "ctx._source.age += 5"
}
批量执行
除了能够索引,更新和删除单个文档之外,Elasticsearch还提供了使用_bulk API批量执行上述任何操作的功能。此功能非常重要,因为它提供了一种非常有效的机制,可以尽可能快地进行多个操作,并尽可能少地进行网络往返。
Bulk API不会因其中一个操作失败而失败。如果单个操作因任何原因失败,它将继续处理其后的其余操作。批量API返回时,它将为每个操作提供一个状态(按照发送的顺序),以便您可以检查特定操作是否失败。
POST /customer/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
此示例更新第一个文档(ID为1),然后在一个批量操作中删除第二个文档(ID为2):
POST /customer/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
Search API
导入一些测试数据
测试数据格式
{
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}
导入
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
查询所有数据
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
分页查询
from参数(从0开始)指定从哪个文档索引开始,size参数指定从from参数开始返回的文档数。在实现搜索结果的分页时,此功能非常有用。请注意,如果未指定from,则默认为0。size默认为10。
GET /bank/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 5
}
只返回感兴趣的字段
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}
过滤请求
GET /bank/_search
{
"query": { "match": { "address": "mill" } }
}
OR 和 AND
此示例返回地址中包含术语“mill”或“lane”的所有帐户
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}
此示例是match(match_phrase)的变体,它返回地址中包含短语“mill lane”的所有帐户
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
bool query
此示例组成两个匹配查询,并返回地址中包含“mill”和“lane”的所有帐户。等价于上面的AND。
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
相反,此示例组成两个匹配查询并返回地址中包含“mill”或“lane”的所有帐户,等价于上面的OR
GET /bank/_search
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
我们可以在bool查询中同时组合must,should和must_not子句。此外,我们可以在任何这些bool子句中组合bool查询来模仿任何复杂的多级布尔逻辑。
Range查询
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
聚合
首先,此示例按状态对所有帐户进行分组,然后返回按计数降序排序的前10个(默认)状态(也是默认值)
请注意,我们将size = 0设置为不显示搜索匹配,因为我们只想在响应中看到聚合结果。
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
在前一个聚合的基础上,此示例按州计算平均帐户余额(同样仅针对按降序排序的前10个州)
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
这个例子演示了我们如何按年龄段(20-29岁,30-39岁和40-49岁),然后按性别分组,最后得到每个年龄段的平均账户余额,每个年龄段
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_gender": {
"terms": {
"field": "gender.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。