Elasticsearch 基础入门

  • 原创
  • Madman
  • /
  • 2018-10-23 13:47
  • /
  • 0
  • 118 次阅读

elk-min.jpg

Synopsis: Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据(结构化、非结构化、地理位置、度量指标),帮助您发现意料之中以及意料之外的情况。无论 Elasticsearch 是在一个节点上运行,还是在一个包含 300 个节点的集群上运行,您都能够以相同的方式与 Elasticsearch 进行通信。 它能够水平扩展,每秒钟可处理海量事件,同时能够自动管理索引和查询在集群中的分布方式,以实现极其流畅的操作

1. 安装 Elasticsearch 6

参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html

1.1 安装 JAVA 8

Elasticsearch是使用Java编写的,它的内部使用Lucene做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。所以,Elasticsearch需要java8或更高版本,先检查CentOS 7的JAVA版本:

[root@CentOS ~]# java -version

如果还没有安装,或版本过低,请先安装JAVA:

[root@CentOS ~]# yum -y install java-1.8.0-openjdk

1.2 安装 Elasticsearch RPM

# 1. Download and install the public signing key
[root@CentOS ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

# 2. Create yum repository
[root@CentOS ~]# vim /etc/yum.repos.d/elasticsearch.repo
内容如下:
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

# 3. Install Elasticsearch
[root@CentOS ~]# yum -y install elasticsearch
[root@CentOS ~]# systemctl enable elasticsearch.service
[root@CentOS ~]# systemctl start elasticsearch.service

Elasticsearch安装好后,默认的配置文件目录为/etc/elasticsearch,默认的安装目录为/usr/share/elasticsearch,默认的启动端口为9200

测试 Elasticsearch 是否启动成功:

[root@CentOS ~]# curl 'http://localhost:9200/?pretty'
{
  "name" : "hSFoO1h",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "N2LATMb4SMemF99wi3TJGA",
  "version" : {
    "number" : "6.4.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "04711c2",
    "build_date" : "2018-09-26T13:34:09.098244Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

可以在/etc/elasticsearch/elasticsearch.yml配置文件中修改cluster.namenode.namepath.datanetwork.hosthttp.port

2. Windows 安装 Kibana

Kibana让您能够可视化 Elasticsearch 中的数据并操作 Elastic Stack。Kibana 核心搭载了一批经典功能:柱状图、线状图、饼图、旭日图等,它们充分利用了 Elasticsearch 的聚合功能

2.1 安装

参考: https://www.elastic.co/guide/en/kibana/current/windows.html

下载.zip压缩包 https://artifacts.elastic.co/downloads/kibana/kibana-6.4.2-windows-x86_64.zip

假设解压到C:\根目录下,那么C:\kibana-6.4.2-windows-x86_64\bin目录为可执行文件所在的地方,用来启动Kibana或安装插件

2.2 配置

由于我们的 Elasticsearch 安装在远程的CentOS上,所以先要修改 Elasticsearch 的配置文件/etc/elasticsearch/elasticsearch.yml中的network.host,默认只允许本机访问(通过 localhost 或 127.0.0.1),现在Windows主机要访问它的话,能够 ping 通 CentOS上的IP: 192.168.40.128,所以我们要把192.168.40.128添加进去:

# ----------------------------- Network ------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#

network.host: localhost, 192.168.40.128

# 或者允许所有主机访问(危险):
# network.host: 0.0.0.0

然后,再修改 Kibana 的配置文件C:\kibana-6.4.2-windows-x86_64\config\kibana.yml中的elasticsearch.url,指向 Elasticsearch 服务地址:

# The URL of the Elasticsearch instance to use for all your queries.
# elasticsearch.url: "http://localhost:9200"
elasticsearch.url: "http://192.168.40.128:9200"

2.3 启动

打开cmd命令行窗口:

cd C:\kibana-6.4.2-windows-x86_64
.\bin\kibana.bat

然后,在浏览器中输入http://localhost:5601,回车即可

3. 与 Elasticsearch 交互

3.1 Java API

参考: https://www.elastic.co/guide/cn/elasticsearch/guide/current/_talking_to_elasticsearch.html#_java_api

如果你正在使用 Java,可以使用 Elasticsearch 内置的两个客户端:节点客户端(Node client)传输客户端(Transport client),并通过9300端口并使用 Elasticsearch 的原生传输协议和集群交互

3.2 RESTful API with JSON over HTTP

参考: https://www.elastic.co/guide/cn/elasticsearch/guide/current/_talking_to_elasticsearch.html#_restful_api_with_json_over_http

我们可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,甚至可以使用curl命令来和 Elasticsearch 交互

一个 Elasticsearch 请求和任何 HTTP 请求一样由几部分(下面的命令中<>标记的内容)组成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
  • VERB: 适当的 HTTP 方法 或 谓词 : GETPOSTPUTHEAD 或者 DELETE
  • PROTOCOLhttp 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)
  • HOST: Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点
  • PORT: 运行 Elasticsearch HTTP 服务的端口号,默认是 9200
  • PATH: API 的终端路径(例如 _count 将返回集群中文档数量)。PATH 可能包含多个组件,例如:_cluster/stats_nodes/stats/jvm
  • QUERY_STRING: 任意可选的查询字符串参数(例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
  • BODY: 一个 JSON 格式的请求体(如果请求需要的话)

例如,计算集群中文档的数量,我们可以用这个:

[root@CentOS ~]# curl -XGET 'http://localhost:9200/_count?pretty' -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    }
}
'
{
  "count" : 542,
  "_shards" : {
    "total" : 21,
    "successful" : 21,
    "skipped" : 0,
    "failed" : 0
  }
}

注意:Elasticsearch 6以后的版本,要求指明Content-Type:application/json头信息,否则会报错"Content-Type header [application/x-www-form-urlencoded] is not supported"

如果将上面的命令复制到KibanaDev Tools -- Console(其实就是Sense插件,现在默认集成到Kibana中了)中去,你会发现它会自动缩写我们的命令:

Kibana console

所谓的缩写格式就是省略请求中所有相同的部分,例如主机名、端口号以及 curl 命令本身,而不是像上面显示的那样用一个完整的请求

4. Elasticsearch 基本概念

elasticsearch vs mysql

4.1 Index

Elasticsearch可以创建多个Index,名字小写:

# 1. 查看所有Index
[root@CentOS ~]# curl -XGET 'http://localhost:9200/_cat/indices?v'
health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   tag      uaquZ8qHS5uWIfHjb3sTNQ   5   1        237            2     90.3kb         90.3kb
yellow open   category A_fz8LgYRbSHqaUHqNvrmQ   5   1          7            0     14.5kb         14.5kb
yellow open   post     k_1vrzJ2SUK_ua_EY_CBQA   5   1         74           13        3mb            3mb
yellow open   media    knyZNWHRQ5uF59WJrqABQw   5   1        222           33    177.3kb        177.3kb

# 2. 创建Index
[root@CentOS ~]# curl -XPUT 'http://localhost:9200/test'
{"acknowledged":true,"shards_acknowledged":true,"index":"test"}

# 3. 关闭Index
[root@CentOS ~]# curl -XPOST 'http://127.0.0.1:9200/test/_close'

# 4. 开启Index
[root@CentOS ~]# curl -XPOST 'http://127.0.0.1:9200/test/_open'

# 5. 删除Index
[root@CentOS ~]# curl -XDELETE 'http://localhost:9200/test'
{"acknowledged":true}

4.2 Mapping和Type

Mapping定义了Document的结构(后续将介绍),以及Field的字段类型,所使用的词法分析器analyzer(后面讲中文分词ik会用到)等属性

注意:必须在创建Index后就立即设置Mapping,不能添加Document后再修改

Document可以按Type分组,但Elasticsearch 6.x 版只允许每个Index包含一个Type,7.x 版将会彻底移除Type,所以一般是将Type命名跟Index一样即可

# 1. 创建Index
[root@CentOS ~]# curl -XPUT 'http://localhost:9200/test'
{"acknowledged":true,"shards_acknowledged":true,"index":"test"}

# 2. 设置Mapping
[root@CentOS ~]# curl -XPOST 'http://localhost:9200/test/test/_mapping' -H 'Content-Type:application/json' -d '
{
    "properties": {
        "published_at": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
    }

}'
{"acknowledged":true}

# 3. 查看Index的Mapping
[root@CentOS ~]# curl -XGET 'http://localhost:9200/test/_mapping?pretty=true'
{
  "test" : {
    "mappings" : {
      "test" : {
        "properties" : {
          "published_at" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          }
        }
      }
    }
  }
}

4.3 Document和Field

Index里面单条的记录称为Document(文档),许多条 Document 构成了一个 Index,Document 使用 JSON 格式表示

# 1. 添加新文档
[root@CentOS ~]# curl -XPOST 'http://localhost:9200/test/test/1' -H 'Content-Type:application/json' -d '
{
    "published_at": "2018-10-23"
}
'
{"_index":"test","_type":"test","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

其中,test/test/1 中的 1 表示该文档的id

继续添加文档:
[root@CentOS ~]# curl -XPOST 'http://localhost:9200/test/test/2' -H 'Content-Type:application/json' -d '
{
    "published_at": "2018-10-23 11:59:30"
}
'

[root@CentOS ~]# curl -XPOST 'http://localhost:9200/test/test/3' -H 'Content-Type:application/json' -d '
{
    "published_at": "1540267175"
}
'

# 2. 查看Index下所有文档
[root@CentOS ~]# curl -XGET 'http://localhost:9200/test/test/_search?pretty=true'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "test",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "published_at" : "2018-10-23 11:59:30"
        }
      },
      {
        "_index" : "test",
        "_type" : "test",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "published_at" : "2018-10-23"
        }
      },
      {
        "_index" : "test",
        "_type" : "test",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "published_at" : "1540267175"
        }
      }
    ]
  }
}

# 3. 查看指定id的文档
[root@CentOS ~]# curl -XGET 'http://localhost:9200/test/test/1?pretty=true'
{
  "_index" : "test",
  "_type" : "test",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "published_at" : "2018-10-23"
  }
}

# 4. 更新指定id的文档
[root@CentOS ~]# curl -XPUT 'http://localhost:9200/test/test/1' -H 'Content-Type:application/json' -d '
{
    "published_at": "2018-01-01"
}
'

# 5. 删除指定id的文档
[root@CentOS ~]# curl -XDELETE 'http://localhost:9200/test/test/3'
{"_index":"test","_type":"test","_id":"3","_version":2,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}

5. 检索

5.1 统计Index下有多少文档

[root@CentOS ~]# curl -XGET 'http://localhost:9200/post/post/_count?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    }
}
'
{
  "count" : 74,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  }
}

5.2 查询Index下的所有文档

[root@CentOS ~]# curl -XGET 'http://localhost:9200/post/post/_search?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    }
}
'

5.3 查询某个字段包含搜索词

[root@CentOS ~]# curl -XGET 'http://localhost:9200/category/category/_search?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "match": {
            "name": "Python"
        }
    }
}
'

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 0.6099695,
    "hits" : [
      {
        "_index" : "category",
        "_type" : "category",
        "_id" : "5b15eaae589dcc4022e83abb",
        "_score" : 0.6099695,
        "_source" : {
          "name" : "Python进阶",
          "slug" : "python-advance",
          "caption" : ""
        }
      },
      {
        "_index" : "category",
        "_type" : "category",
        "_id" : "5b0f73d4589dcc4022e83aba",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "Python入门",
          "slug" : "python-basic",
          "caption" : ""
        }
      },
      {
        "_index" : "category",
        "_type" : "category",
        "_id" : "5b0f735d589dcc4024069382",
        "_score" : 0.25069216,
        "_source" : {
          "name" : "Python",
          "slug" : "python",
          "caption" : ""
        }
      },
      {
        "_index" : "category",
        "_type" : "category",
        "_id" : "5b335765589dcc4022e83acd",
        "_score" : 0.14325266,
        "_source" : {
          "name" : "Python3 爬虫系列",
          "slug" : "python3-spider",
          "caption" : ""
        }
      }
    ]
  }
}

说明:name包含Python的文档共查询到4条

5.4 查询多个字段包含搜索词

[root@CentOS ~]# curl -XGET 'http://localhost:9200/post/post/_search?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "multi_match": {
            "query": "生成器",
            "fields": ["title", "summary"]
        }
    }
}
'

如果想查询Index下面的所有字段包含搜索词的文档:

[root@CentOS ~]# curl -XGET 'http://localhost:9200/post/post/_search?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "multi_match": {
            "query": "生成器",
            "fields": ["*"]
        }
    }
}
'

5.5 查询多个id对应的文档

[root@CentOS ~]# curl -XGET 'http://localhost:9200/category/category/_search?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "ids": {
            "values": ["5b0f735d589dcc4024069382", "5ac1e09acdc8723e08171e6b"]
        }
    }
}
'

5.6 返回查询集的部分(切片/分页)

[root@CentOS ~]# curl -XGET 'http://localhost:9200/post/post/_search?pretty=true' -H 'Content-Type:application/json' -d '
{
    "query": {
        "multi_match": {
            "query": "生成器",
            "fields": ["*"]
        }
    },
    "from": 3,
    "size": 5
}
'

说明:从第3条记录开始,共返回5条记录,如果少于5条,则只返回剩余所有的记录
分类: ELK
标签: elasticsearch elk 全文检索
未经允许不得转载: LIFE & SHARE - 王颜公子 » Elasticsearch 基础入门

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录