Elasticsearch 入门教程

Elasticsearch 入门教程

本文根据官方文档指南,基于docker 容器快速搭建 Elasticsearch 环境,并结合阮一峰博客全文搜索引擎 Elasticsearch 入门教程Elasticsearch 快速入门进行总结。

强烈建议阅读本文前先学习阮一峰博客,链接如下:全文搜索引擎 Elasticsearch 入门教程

安装

官网安装教程地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

基本概念

1. Node 与 Cluster

Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例,单个 Elastic 实例称为一个节点(node),一组节点构成一个集群(cluster)。

2. Index

Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

下面的命令可以查看当前节点的所有 Index

$ curl -X GET 'http://localhost:9200/_cat/indices?v'

3. 添加单个数据

POST logs-my_app-default/_doc
{
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "event": {
    "original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
  }
}

结果:

{
  "_index": ".ds-logs-my_app-default-2099-05-06-000001",
  "_type": "_doc",
  "_id": "gl5MJXMBMk1dGnErnBW8",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

4. 添加多个数据

PUT logs-my_app-default/_bulk
{ "create": { } }
{ "@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } }
{ "create": { } }
{ "@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } }

5. 搜索数据

查询所有匹配数据:logs-my_app-default,并以@timestamp 降序显示

GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}
结果:
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      {
        "_index": ".ds-logs-my_app-default-2099-05-06-000001",
        "_type": "_doc",
        "_id": "PdjWongB9KPnaVm2IyaL",
        "_score": null,
        "_source": {
          "@timestamp": "2099-05-08T16:25:42.000Z",
          "event": {
            "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638"
          }
        },
        "sort": [
          4081940742000
        ]
      },
      ...
    ]
  }
}

6. 解析固定字段,去除一些字段:

GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

结果:

{
  ...
  "hits": {
    ...
    "hits": [
      {
        "_index": ".ds-logs-my_app-default-2099-05-06-000001",
        "_type": "_doc",
        "_id": "PdjWongB9KPnaVm2IyaL",
        "_score": null,
        "fields": {
          "@timestamp": [
            "2099-05-08T16:25:42.000Z"
          ]
        },
        "sort": [
          4081940742000
        ]
      },
      ...
    ]
  }
}

"fields"挑选字段解析,'_source':false,该字段不再显示

7. 范围搜索 range

GET logs-my_app-default/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "2099-05-05",
        "lt": "2099-05-08"
      }
    }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

查询过去一天的数据

GET logs-my_app-default/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-1d/d",
        "lt": "now/d"
      }
    }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

8. 新建 索引 Index

PUT my_index
{
  "mappings": 
  {
    "properties": 
    {
      "address":
      {
        "type": "ip"
      },
      "port":
      {
        "type": "long"
      }
    }
  }
}

结果:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_index"
}

9. 将一些文档加载到其中:

POST my_index/_bulk
{"index":{"_id":"1"}}
{"address":"1.2.3.4","port":"80"}
{"index":{"_id":"2"}}
{"address":"1.2.3.4","port":"8080"}
{"index":{"_id":"3"}}
{"address":"2.4.8.16","port":"80"}

返回结果:

{
  "took" : 8,
  "errors" : false,
  "items" : [
    {
      "index" : {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 0,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "index" : {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 1,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "index" : {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 2,
        "_primary_term" : 1,
        "status" : 201
      }
    }
  ]
}

10. 使用静态字符串创建两个

GET my_index/_search
 {
   "runtime_mappings": {
     "socket": {
       "type": "keyword",
       "script": {
         "source": "emit(doc['address'].value + ':' + doc['port'].value)"
       }
     }
   },
   "fields": [
     "socket"
   ],
   "query": {
     "match": {
       "socket": "1.2.3.4:8080"
     }
   }
}

返回结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "address" : "1.2.3.4",
          "port" : "8080"
        },
        "fields" : {
          "socket" : [
            "1.2.3.4:8080"
          ]
        }
      }
    ]
  }
}

上面代码中,返回结果的 took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下:

  • total:返回记录数,本例是2条。
  • max_score:最高的匹配程度,本例是1.0。
  • hits:返回的记录组成的数组。

返回的数据中,found字段表示查询成功,_source字段返回原始记录。

我们在 runtime_mappings 部分中定义了字段 socket。 我们使用了一个简短的 painless script,该脚本定义了每个文档将如何计算 socket 的值(使用 + 表示 address 字段的值与静态字符串 “:” 和 port 字段的值的串联)。 然后,我们在查询中使用了字段 socket。 字段 socket 是一个临时运行时字段,仅对于该查询存在,并且在运行查询时进行计算。 在定义要与 runtime fields 一起使用的 painless script 时,必须包括 emit 以返回计算出的值。

socket :运行时加入的字段。source, id

官方文档:The script itself, which you specify as source for an inline script or id for a stored script. Use the stored script APIs to create and manage stored scripts.

"source": "emit(doc['address'].value + ':' + doc['port'].value)" 为内嵌脚本

11. 如果我们发现 socket 是一个我们想在多个查询中使用的字段,而不必为每个查询定义它,则可以通过调用简单地将其添加到映射中:

PUT my_index/_mapping
 {
   "runtime": {
     "socket": {
       "type": "keyword",
       "script": {
         "source": "emit(doc['address'].value + ':' + doc['port'].value)"
       }
     } 
   } 
}

结果:

{
  "acknowledged" : true
}

此时在Index mapping 文件里已经存在socket字段,然后查询,不必在运行时定义包含 socket 字段,例如

GET my_index/_search
{
  "fields": [
    "socket"
  ],
  "query": {
    "match": {
      "socket": "1.2.3.4:8080"
    }
  }
}

结果(和使用静态字符串创建两个结果一样):

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "address" : "1.2.3.4",
          "port" : "8080"
        },
        "fields" : {
          "socket" : [
            "1.2.3.4:8080"
          ]
        }
      }
    ]
  }
}

仅在要显示 socket 字段的值时才需要语句 "fields": ["socket"]。 现在,字段查询可用于任何查询,但它不存在于索引中,并且不会增加索引的大小。 仅在查询需要 socket 以及需要它的文档时才计算 socket

12. runtimeruntime_mapping区别:

使用runtime 时定义的字段会存储到Index映射中,而runtime_mapping 定义的字段只存在运行查询中。

映射字段:https://www.elastic.co/guide/en/elasticsearch/reference/7.11/runtime-mapping-fields.html#runtime-mapping-fields

请求字段: https://www.elastic.co/guide/en/elasticsearch/reference/7.11/runtime-search-request.html#runtime-search-request

13. 在查询时覆盖字段值

PUT my_raw_index
{
  "mappings": {
    "properties": {
      "raw_message": {
        "type": "keyword"
      },
      "address": {
        "type": "ip"
      }
    }
  }
}

结果:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_raw_index"
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个分布式的开源搜索和分析引擎,它可以快速地处理大量数据,并且可以进行实时搜索和分析。本教程将介绍Elasticsearch的基本概念、安装、配置和使用方法。 1. 基本概念 - 索引(Index):类似于关系型数据库中的数据库,用于存储文档。 - 类型(Type):类似于关系型数据库中的表,用于组织文档。 - 文档(Document):类似于关系型数据库中的行,用于存储数据。 - 字段(Field):文档中存储的数据的属性。 2. 安装 首先需要安装Java环境,然后下载Elasticsearch安装包并解压缩。在解压缩后的目录下运行bin/elasticsearch,即可启动Elasticsearch。 3. 配置 Elasticsearch的配置文件位于config/elasticsearch.yml。其中需要配置的参数包括: - cluster.name:集群名称。 - node.name:节点名称。 - network.host:节点绑定的IP地址。 - http.port:节点监听的HTTP端口号。 还可以根据需要配置更多参数,具体可以参考官方文档。 4. 使用 Elasticsearch提供了RESTful API,可以使用各种编程语言进行访问。下面介绍一些常用的API。 - PUT /index/type/id:创建一个文档。 - GET /index/type/id:获取一个文档。 - DELETE /index/type/id:删除一个文档。 - POST /index/type/_search:搜索文档。 - POST /index/_analyze:分析文本。 以上只是Elasticsearch提供的一小部分API,具体可以参考官方文档。 5. 总结 本教程介绍了Elasticsearch的基本概念、安装、配置和使用方法。如果想深入学习Elasticsearch,可以阅读官方文档并进行实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值