APP下载
报价宝  ›  科技  › 

Elasticsearch 入门使用 基本概念就只有这么多

报价宝 来源:baojiabao.com 发布时间:2019-08-31 03:56:00 09月21日更新
报价宝综合消息Elasticsearch 入门使用 基本概念就只有这么多

Elasticsearch 入门使用

Elasticsearch 是一款稳定高效的分散式搜寻和分析引擎,它的底层基于 Lucene,并提供了友好的 RESTful API 来对资料进行操作,还有比较重要的一点是, Elasticsearch 开箱即可用,上手也比较容易。

目前 Elasticsearch 在搭建企业级搜寻(如日志搜寻、商品搜寻等)平台中很广泛,官网也提供了不少案例,比如:

GitHub 使用 Elasticsearch 检索超过 800 万的程式码库eBay 使用 Elasticsearch 搜寻海量的商品资料Netflix 使用 Elasticsearch 来实现高效的讯息传递系统本文主要介绍 Elasticsearch 的基本概念及入门使用。

安装

在安装 Elasticsearch 之前,请确保你的计算机已经安装了 Java。目前 Elasticsearch 的最新版是 5.2,需要安装 Java 8,如果你用的是老版本的 Elasticsearch,如 2.x 版,可用 Java 7,但还是推荐使用 Java 8。

可以使用如下的命令检查 Java 的版本:

$ java -version

接着,我们可以从这里下载最新版本的 Elasticsearch,也可使用 wget 下载,如下:

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz

Windows 使用者也可以下载 .zip 格式的安装包。

下载完后进行解压:

$ tar -zxvf elasticsearch-5.2.2.tar.gz

执行

首先,我们进入到刚刚解压出来的目录中:

$ cd elasticsearch-5.2.2

接着,使用如下命令启动 Elasticsearch:

$ bin/elasticsearch

此时,如果正常的话,你可以在终端看到类似如下的输出:

上面的命令是在前台执行的,如果想在后台以守护程序模式执行,可以加 -d 引数。

Elasticsearch 启动后,也启动了两个埠 9200 和 9300:

9200 埠:HTTP RESTful 界面的通讯埠9300 埠:TCP 通讯埠,用于丛集间节点通讯和与 Java 客户端通讯的埠现在,让我们做一些测试。在浏览器访问连结 http://localhost:9200/ ,或使用 curl 命令:

$ curl 'http://localhost:9200/?pretty'

我们可以看到类似如下的输出:

概念

在进一步使用 Elasticsearch 之前,让我们先了解几个关键概念。

在逻辑层面:

Index (索引):这里的 Index 是名词,一个 Index 就像是传统关系数据库的 Database,它是 Elasticsearch 用来储存资料的逻辑区域Document (文件):Elasticsearch 使用 JSON 文件来表示一个物件,就像是关系数据库中一个 Table 中的一行资料Type (型别):文件归属于一种 Type,就像是关系数据库中的一个 TableField (字段):每个文件包含多个字段,类似关系数据库中一个 Table 的列我们用一个表格来做类比,如下:

在物理层面:

Node (节点):node 是一个执行着的 Elasticsearch 例项,一个 node 就是一个单独的 serverCluster (丛集):cluster 是多个 node 的集合Shard (分片):资料分片,一个 index 可能会存在于多个 shard

使用

接下来,我们看看如何建立索引、建立文件等,就好比在 MySQL 中进行诸如建立数据库,插入资料等操作。

新增文件

下面,我们将建立一个储存电影资讯的 Document:

Index 的名称为 movieType 为 adventureDocument 有两个字段:name 和 actors我们使用 Elasticsearch 提供的 RESTful API 来执行上述操作,如图所示:

用 url 表示一个资源,比如 /movie/adventure/1 就表示一个 index 为 movie,type 为 adventure,id 为 1 的 document用 http 方法操作资源,如使用 GET 获取资源,使用 POST、PUT 新增或更新资源,使用 DELETE 删除资源等我们可以使用 curl 命令来执行上述操作:

$ curl -i -X PUT "localhost:9200/movie/adventure/1" -d '{"name": "Life of Pi", "actors": ["Suraj", "Irrfan"]}'

不过,本文推荐使用 httpie,类似 curl,但比 curl 更好用,将上面的命令换成 httpie,如下:

$ http put :9200/movie/adventure/1 name="Life of Pi" actors:='["Suraj", "Irrfan"]'

上面的命令结果如下:

可以看到,我们已经成功建立了一个 _index 为 movie,_type 为 adventure,_id 为 1 的文件。

我们通过 GET 请求来检视这个文件的资讯:

$ http :9200/movie/adventure/1

结果如下:

可以看到,原始的文件资料存在了 _source 字段中。

如果我们的资料没有 id,也可以让 Elasticsearch 自动为我们生成,此时要使用 POST 请求,形式如下:

POST /movie/adventure/

{

"name": "Life of Pi"

}

更新整个文件

当我们使用 PUT 方法指明文件的 _index, _type 和 _id时,如果 _id 已存在,则新文件会替换旧文件,此时文件的 _version 会增加 1,并且 _created 字段为 false。比如:

$ http put :9200/movie/adventure/1 name="Life of Pi"

结果如下:

使用 GET 请求检视新文件的资料:

$ http :9200/movie/adventure/1

结果如下:

可以看到,actors 这个字段已经不存在了,文件的 _version 变成了 2。

因此,为了避免在误操作的情况下,原文件被替换,我们可以使用 _create 这个 API,表示只在文件不存在的情况下才建立新文件(返回 201 Created),如果文件存在则不做任何操作(返回 409 Conflict),命令如下:

$ http put :9200/movie/adventure/1/_create name="Life of Pi"

由于文件 id 存在,会返回 409 Conflict。

区域性更新

在有些情况下,我们只想更新文件的区域性,而不是整个文件,这时我们可以使用 _update 这个 API。

现在,待更新的文件资讯如下:

最简单的 update 请求接受一个区域性文件引数 doc,它会合并到现有文件中:将物件合并在一起,存在的标量字段被覆盖,新字段被新增。

形式如下:

POST /movie/adventure/1/_update

{

"doc": {

"name": "life of pi"

}

}

由于有巢状字段,我们可以这样使用 http(这里需要注意使用 POST 方法):

$ echo '{"doc": {"actors": ["Suraj", "Irrfan"]}}' | http post :9200/movie/adventure/1/_update

上面的命令中,我们添加了一个新的字段:actors,结果如下:

可以看到,_version 增加了 1,result 的结果是 updated。

检索文件

检索某个文件

要检索某个文件很简单,我们只需使用 GET 请求并指出文件的 index, type, id 就可以了,比如:

$ http :9200/movie/adventure/1/

响应内容会包含文件的元资讯,文件的原始资料存在 _source 字段中。

我们也可以直接检索出文档的 _source 字段,如下:

$ http :9200/movie/adventure/1/_source

检索所有文件

我们可以使用 _search 这个 API 检索出所有的文件,命令如下:

$ http :9200/movie/adventure/_search

返回结果如下:

可以看到,hits 这个 object 包含了 hits 阵列,total 等字段,其中,hits 阵列包含了所有的文件,这里只有一个文件,total 表明了文件的数量,预设情况下会返回前 10 个结果。我们也可以设定 From/Size 引数来获取某一范围的文件,可参考这里,比如:

$ http :9200/movie/adventure/_search?from=1&size=5

当不指定 from 和 size 时,会使用预设值,其中 from 的预设值是 0,size 的预设值是 10。

检索某些字段

有时候,我们只需检索文件的个别字段,这时可以使用 _source 引数,多个字段可以使用逗号分隔,如下所示:

$ http :9200/movie/adventure/1?_source=name

$ http :9200/movie/adventure/1?_source=name,actors

query string 搜寻

query string 搜寻以 q=field:value 的形式进行查询,比如查询 name 字段含有 life 的电影:

$ http :9200/movie/adventure/_search?q=name:life

DSL 搜寻

上面的 query string 搜寻比较轻量级,只适用于简单的场合。Elasticsearch 提供了更为强大的 DSL(Domain Specific Language)查询语言,适用于复杂的搜寻场景,比如全文搜寻。我们可以将上面的 query string 搜寻转换为 DSL 搜寻,如下:

GET /movie/adventure/_search

{

"query" : {

"match" : {

"name" : "life"

}

}

}

如果使用 httpie,可以这样:

$ echo '{"query": {"match": {"name": "life"}}}' | http get :9200/movie/adventure/_search

如果使用 curl,可以这样:

$ curl -X GET "127.0.0.1:9200/movie/adventure/_search" -d '{"query": {"match": {"name": "life"}}}'

文件是否存在

使用 HEAD 方法检视文件是否存在:

$ http head :9200/movie/adventure/1

如果文件存在则返回 200,否则返回 404。

删除文件

使用 DELETE 方法删除文件:

$ http delete :9200/movie/adventure/1

小结

Elasticsearch 通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜寻变得简单在建立文件时,我们可以用 POST 方法指定将文件新增到某个 _index/_type 下,来让 Elasticsearch自动生成唯一的 _id;而用 PUT 方法指定将文件的 _index/_type/_id原文:https://juejin.im/post/58d1d7530ce4630057e6053a
文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 数码相机价格 笔记本价格 电视机价格 小米手机价格 华为手机价格