Elasticsearch入门教程
ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,所以您值得拥有。 在本教程中,将介绍开始使用ElasticSearch的一些主要概念。
下载并运行ElasticSearch
ElasticSearch可以从https://www.elastic.co/cn/downloads/下载对应的文件格式,如ZIP
和TAR.GZ
。下载并提取一个运行它的软件包之后,需要提前安装Java运行时环境。
在Windows上运行ElasticSearch
在本文章中,所使用的环境是Windows,所以这里只介绍在Windows上运行ElasticSearch,可从命令窗口运行位于bin
文件夹中的elasticsearch.bat
。这将会启动ElasticSearch在控制台的前台运行,这意味着我们可在控制台中看到运行信息或一些错误信息,并可以使用CTRL + C停止或关闭它。
当前版本是: elasticsearch-5.2.0
下载链接: http://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.zip
把下载好的文件 elasticsearch-5.2.0.zip
解压到 D:\elasticsearch-5.2.0
,其目录结构如下所示
启动 ElasticSearch
D:\elasticsearch-5.2.0>cd binD:\elasticsearch-5.2.0\bin>elasticsearch.bat
[2019-08-28T15:48:31,291][INFO ][o.e.n.Node ] [] initializing ...
[2019-08-28T15:48:31,831][INFO ][o.e.e.NodeEnvironment ] [ZGmKGCe] using [1]
data paths, mounts [[Windows7_OS (C:)]], net usable_space [35.1gb], net total_sp
ace [100gb], spins? [unknown], types [NTFS]
[2019-08-28T15:48:31,832][INFO ][o.e.e.NodeEnvironment ] [ZGmKGCe] heap size
[1.9gb], compressed ordinary object pointers [true]
[2019-08-28T15:48:31,864][INFO ][o.e.n.Node ] node name [ZGmKGCe]
derived from node ID [ZGmKGCepRqqZJnsrQgy8jw]; set [node.name] to override
[2019-08-28T15:48:31,893][INFO ][o.e.n.Node ] version[5.2.0], pid[
2584], build[24e05b9/2017-01-24T19:52:35.800Z], OS[Windows 7/6.1/amd64], JVM[Ora
cle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_211/25.211-b12]
[2019-08-28T15:48:34,249][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [aggs-matrix-stats]
[2019-08-28T15:48:34,462][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [ingest-common]
[2019-08-28T15:48:34,504][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [lang-expression]
[2019-08-28T15:48:34,916][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [lang-groovy]
[2019-08-28T15:48:35,048][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [lang-mustache]
[2019-08-28T15:48:35,051][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [lang-painless]
[2019-08-28T15:48:35,059][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [percolator]
[2019-08-28T15:48:35,063][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [reindex]
[2019-08-28T15:48:35,070][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [transport-netty3]
[2019-08-28T15:48:35,073][INFO ][o.e.p.PluginsService ] [ZGmKGCe] loaded mod
ule [transport-netty4]
[2019-08-28T15:48:35,075][INFO ][o.e.p.PluginsService ] [ZGmKGCe] no pluginsloaded
[2019-08-28T15:48:40,674][INFO ][o.e.n.Node ] initialized
[2019-08-28T15:48:40,677][INFO ][o.e.n.Node ] [ZGmKGCe] starting .
..
[2019-08-28T15:48:42,432][INFO ][o.e.t.TransportService ] [ZGmKGCe] publish_ad
dress {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}, {[::1]:9300}
[2019-08-28T15:48:45,535][INFO ][o.e.c.s.ClusterService ] [ZGmKGCe] new_master{ZGmKGCe}{ZGmKGCepRqqZJnsrQgy8jw}{nwAiNuHXSh-r-tz6VApozA}{127.0.0.1}{127.0.0.1:
9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2019-08-28T15:48:45,918][INFO ][o.e.g.GatewayService ] [ZGmKGCe] recovered
[0] indices into cluster_state
[2019-08-28T15:48:46,279][INFO ][o.e.h.HttpServer ] [ZGmKGCe] publish_ad
dress {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}, {[::1]:9200}
[2019-08-28T15:48:46,279][INFO ][o.e.n.Node ] [ZGmKGCe] started
在启动过程中,ElasticSearch的实例运行会占用大量的内存,所以在这一过程中,电脑会变得比较慢,需要耐心等待,启动加载完成后电脑就可以正常使用了。
如果您没有安装Java运行时或没有正确配置,应该不会看到像上面的输出,而是一个消息说“JAVA_HOME环境变量必须设置!“ 要解决这个问题,首先下载并安装Java,其次,确保已正确配置
JAVA_HOME
环境变量。
启动以后我们就可以通过浏览器访问ElasticSearch web端 地址是http://localhost:9200/,效果如下图所示
使用REST API与Sense
当ElasticSearch的实例并运行,您可以使用localhost:9200
,基于JSON的REST API与ElasticSearch进行通信。使用任何HTTP客户端来通信。在ElasticSearch自己的文档中,所有示例都使用curl。 但是,当使用API时也可使用图形客户端(如Fiddler或RESTClient),这样操作起更方便直观一些。
更方便的是Chrome插件Sense。 Sense提供了一个专门用于使用ElasticSearch的REST API的简单用户界面。 它还具有许多方便的功能(具体安装见文章链接https://blog.csdn.net/qq_40241957/article/details/100133121),例如:ElasticSearch的查询语法的自动完成功能以及curl格式的复制和粘贴请求,从而可以方便地在文档中运行示例。
我们将在本教程中使用sense来执行curl请求,建议安装Sense并使用它学习后续文章内容。
安装完成后,在Chrome的右上角找到Sense的图标。 第一次单击它运行Sense时,会为您准备一个非常简单的示例请求。如下图所示
上述请求将执行最简单的搜索查询,匹配服务器上所有索引中的所有文档。针对ElasticSearch运行,Sense提供的最简单的查询,在响应结果的数据中并没有查询到任何数据,因为没有任何索引。
{"took": 1,"timed_out": false,"_shards": {"total": 0,"successful": 0,"failed": 0},"hits": {"total": 0,"max_score": 0,"hits": []}
}
下一步我们来学习添加一些数据和索引,来修复这个问题。
文档管理(CRUD)
想要使用ElasticSearch,用于搜索第一步就是使用一些数据填充来索引
创建索引
在ElasticSearch索引中,对应于CRUD中的“创建”和“更新” - 如果对具有给定类型的文档进行索引,并且要插入原先不存在的ID。 如果具有相同类型和ID的文档已存在,则会被覆盖。
要索引一个JSON对象,我们对REST API创建一个PUT请求到一个由索引名称,类型名称和ID组成的URL。 也就是:http://localhost:9200/<index>/<type>/[<id>]
。
索引和类型是必需的,而id
部分是可选的。如果不指定ID
,ElasticSearch会为我们生成一个ID
。 但是,如果不指定id,应该使用HTTP的POST
而不是PUT
请求。 (解释:比如curl -XPUT "http://localhost:9200/movies/movie/1" -d'
就是PUT请求,curl -XGET "http://localhost:9200/movies/movie/1" -d''
就是GET请求)
索引名称是任意的。如果服务器上没有此名称的索引,则将使用默认配置来创建一个索引。
至于类型名称,它也是任意的。 它有几个用途,包括:
- 每种类型都有自己的ID空间。
- 不同类型具有不同的映射(“模式”,定义属性/字段应如何编制索引)。
- 搜索多种类型是可以的,并且也很常见,但很容易搜索一种或多种指定类型。
现在我们来创建一个索引! 可以把任何东西放到索引(解释:索引就类似于“数据库”)中,只要它可以表示为单个JSON对象。 在本教程中,使用索引来搜索电影做一个示例。这是一个经典的电影对象信息:
{"title": "The Godfather","director": "Francis Ford Coppola","year": 1972
}
要创建一个索引,这里使用索引的名称为“movies”,类型名称(“movie”)和id(“1”),在Sense里面写下面的代码,然后执行,就会在elasticSearch中创建一个索引
curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{"title": "The Godfather","director": "Francis Ford Coppola","year": 1972
}
可以使用curl来执行它,也可以使用Sense。这里使用Sense,可以自己填充URL,方法和请求正文,或者您复制上述curl示例,将光标置于Sense中的正文字段中写入上面的Json对象,然后按点击绿色小箭头来执行创建索引操作。如下图所示
执行请求后,可以看到接收到来自ElasticSearch响应的JSON对象。如上图右半部分所示
响应对象包含有关索引操作的信息,例如它是否创建成功(“true”)和文档ID,如果不指定则ElasticSearch会自己生成一个。
更新索引
现在,在索引中有了一部电影信息,接下来来了解如何更新它。要做到这一点,只需使用相同的ID索引它。使用与之前完全相同的索引请求,但类型扩展了JSON对象。比如我们在原电影信息的基础上加一个"genres": [“Crime”, “Drama”],如下代码所示
curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{"title": "The Godfather","director": "Francis Ford Coppola","year": 1972,"genres": ["Crime", "Drama"]
}
ElasticSearch的响应结果与前面的大体上一样,但有一点区别,结果对象中的_version
属性的值为2
,而不是1
。响应结果如下
版本号(_version
)可用于跟踪文档已编入索引的次数。它的主要目的是允许乐观的并发控制,因为可以在索引请求中提供一个版本,如果提供的版本高于索引中的版本,ElasticSearch将只覆盖文档内容,ID值不变,版本号自动添加。
由ID获取文档/索引
上面已经学习了索引新文档以及更新存在的文档。还看到了一个简单搜索请求的示例。如果只是想检索一个具有已知ID的索引,一个方法是搜索索引中的文档。另一个简单而快速的方法是通过ID
,使用GET
来检索它。
简单的做法是向同一个URL发出一个GET请求,URL的ID部分是强制性的。通过ID从ElasticSearch中检索文档可发出URL的GET请求:http://localhost:9200/<index>/<type>/<id>
。
使用以下请求尝试获取电影信息:
curl -XGET "http://localhost:9200/movies/movie/1" -d''
执行结果如下所示 -
正如上图所看到的,结果对象包含与索引时所看到的类似的元数据,如索引,类型和版本信息。 最后最重要的是,它有一个名称为“_source
”的属性,它包含实际获取的文档信息。
关于GET没有什么可说的,因为它很简单,继续最后删除操作.
删除文档
为了通过ID从索引中删除单个指定的文档,使用与获取索引文档相同的URL,只是这里将HTTP方法更改为DELETE
curl -XDELETE "http://localhost:9200/movies/movie/1" -d''
响应对象包含元数据方面的一些常见数据字段,以及名为“_found
”的属性,表示文档确实已找到并且操作成功。
在执行DELETE
调用后切换回GET
,可以验证文档是否确实已删除。
搜索
在前面,已经介绍了在ElasticSearch索引中处理数据的基础知识,现在是时候进行核心功能的学习了。考虑到之前我们删除索引中的所有文档,所以,在进行搜索 学习之前,需要一些添加一些示例数据。使用以下这些请求和数据对象来创建索引。
curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{"title": "The Godfather","director": "Francis Ford Coppola","year": 1972,"genres": ["Crime", "Drama"]
}'curl -XPUT "http://localhost:9200/movies/movie/2" -d'
{"title": "Lawrence of Arabia","director": "David Lean","year": 1962,"genres": ["Adventure", "Biography", "Drama"]
}'curl -XPUT "http://localhost:9200/movies/movie/3" -d'
{"title": "To Kill a Mockingbird","director": "Robert Mulligan","year": 1962,"genres": ["Crime", "Drama", "Mystery"]
}'curl -XPUT "http://localhost:9200/movies/movie/4" -d'
{"title": "Apocalypse Now","director": "Francis Ford Coppola","year": 1979,"genres": ["Drama", "War"]
}'curl -XPUT "http://localhost:9200/movies/movie/5" -d'
{"title": "Kill Bill: Vol. 1","director": "Quentin Tarantino","year": 2003,"genres": ["Action", "Crime", "Thriller"]
}'curl -XPUT "http://localhost:9200/movies/movie/6" -d'
{"title": "The Assassination of Jesse James by the Coward Robert Ford","director": "Andrew Dominik","year": 2007,"genres": ["Biography", "Crime", "Drama"]
}
_search端点
现在已经把一些电影信息放入了索引,可以通过搜索看看是否可找到它们。 为了使用ElasticSearch进行搜索,我们使用_search
端点,可选择使用索引和类型。也就是说,按照以下模式向URL发出请求:http://localhost:9200/<index>/<type>/_search
。其中,index
和type
都是可选的。
换句话说,为了搜索电影,可以对以下任一URL进行POST请求:
http://localhost:9200/_search
- 搜索所有索引和所有类型。(既没有指定index,也没有指定type)http://localhost:9200/movies/_search
- 在电影索引中搜索所有类型(因为只指定了index,没指定type)http://localhost:9200/movies/movie/_search
- 在电影索引中显式搜索电影类型的文档。(既指定了index,也指定了type)
因为我们只有一个单一的索引和单一的类型,所以怎么使用都不会有什么问题。为了简洁起见使用第一个URL。
搜索请求正文和ElasticSearch查询DSL
如果只是发送一个请求到上面的URL,我们会得到所有的电影信息。为了创建更有用的搜索请求,还需要向请求正文中提供查询。 请求正文是一个JSON对象,除了其它属性以外,它还要包含一个名称为“query
”的属性,这就可使用ElasticSearch的查询DSL。
{"query": {//Query DSL here}
}
你可能想知道查询DSL是什么。它是ElasticSearch自己基于JSON的域特定语言,可以在其中表达查询和过滤器。想象ElasticSearch它像关系数据库的SQL。
基本自由文本搜索
现在尝试在几部电影的标题中搜索有“kill”这个词的电影信息:
curl -XPOST "http://localhost:9200/_search" -d'
{"query": {"query_string": {"query": "kill"}}
}'
执行上面的请求并查看结果,如下所示
再看看另一种情况,在特定字段中搜索。
指定搜索的字段
这样的设置称为“fields
”,可用于指定要搜索的字段列表。如果不使用“fields
”字段,ElasticSearch查询将默认自动生成的名为“_all
”的特殊字段,来基于所有文档中的各个字段匹配搜索。
为了做到这一点,修改以前的搜索请求正文,以便查询字符串查询有一个fields
属性用来要搜索的字段数组:
curl -XPOST "http://localhost:9200/_search" -d'
{"query": {"query_string": {"query": "ford", //指定搜索字段的值"fields": ["title"] //指定搜索字段}}
}'
执行上面查询它,看看会有什么结果(应该只匹配到 1 条数据):
正如预期的得到一个命中,电影的标题中的单词“ford
”。现在,从查询中移除fields
属性,应该能匹配到 3 行数据:
过滤
前面已经介绍了几个简单的自由文本搜索查询。现在来看看另一个示例,搜索“drama
”,不明确指定字段,如下查询
curl -XPOST "http://localhost:9200/_search" -d'
{"query": {"query_string": {"query": "drama"}}
}'
执行结果如下图:
因为在索引中有五部电影在_all
字段(从所有类别字段)中包含单词“drama
”,所以得到了上述查询的5
个命中。 现在,想象一下,如果我们想限制这些命中为只是1962
年发布的电影。要做到这点,需要应用一个过滤器,要求“year
”字段等于1962
。
要添加过滤器,修改搜索请求正文,以便当前的顶级查询(查询字符串查询)包含在过滤的查询中:
POST /_search
{"query": {"bool": {"filter": {"query_string": {"query": "drama"}},"must": { "match": { "year": 1962 } //这里填写过滤条件}}}
}
执行结果如下:当执行上面请求,只得到两个命中,这个两个命中的数据的 year
字段的值都是等于 1962
。
无需查询即可进行过滤
下面的match_all
指“所有的字段”, 所以下面的代码的意思就是“”对所有的字段都进行过滤条件的查找“”
POST /_search
{"query": {"bool": {"filter": {"match_all": { //对所有字段都进行过滤}},"must": { //过滤条件"match": { "year": 1962 }}}}
}
执行结果如下:
另一个更简单的方法是使用常数分数查询:
讲解:下面的constant_score
的作用是“将查找之后的结果按照过滤条件匹配的频率大小来排序,比如某一条记录里面出现"year": 1962,出现了很多次,那么他就优先级更高,优先展示出来”
POST /_search
{"query": {"constant_score": {"filter": {"term": { "year": 1962 }}} }
}
本文转载自:https://www.yiibai.com/elasticsearch/elasticsearch-getting-start.html
Elasticsearch入门教程相关推荐
- python elasticsearch 入门教程(二) ---全文搜索
python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...
- ElasticSearch入门教程-索引
ElasticSearch入门教程-索引 在本节中,我们将向Elasticsearch添加一些索引,映射和数据.此数据将用于本教程中说明的示例中. 创建索引 PUT http://localhost: ...
- ElasticSearch入门教程(1)
目录 1.1ElasticSearch是什么? 2.1Elasticsearch安装 2.1.1 下载软件 2.2.2使用Postman客户端工具 2.2.3数据格式 正(排)向索引 倒排索引 2.2 ...
- ElasticSearch 入门教程笔记
视频教程:[狂神说Java]ElasticSearch7.6.x最新完整教程通俗易懂 视频地址:https://www.bilibili.com/video/BV17a4y1x7zq 拒绝白嫖,感谢狂 ...
- Elasticsearch系列-Elasticsearch入门教程
引言 Elasticsearch是著名的开源分布式搜索和数据处理平台,是一个基于Lucene的分布式.实时.全文搜索系统,其稳定.可靠.高可用.可大规模扩展等特性,使得Elasticsearch的应用 ...
- python elasticsearch 入门教程(一)
写入数据 from elasticsearch import Elasticsearch es = Elasticsearch() body1={"first_name" : &q ...
- Elasticsearch 入门教程
目录 一.安装 二.基本概念 2.1 Node 与 Cluster 2.2 Index 2.3 Document 2.4 Type 三.新建和删除 Index 四.中文分词设置 五.数据操作 5.1 ...
- ElasticSearch入门教程--安装
Elasticsearch - 安装 安装Elasticsearch的步骤如下 - 第1步 - 检查安装好计算机的java的最低版本,它应该是java 7或更高版本.您可以通过执行以下操作进行检查 - ...
- Elasticsearch入门教程(五):Elasticsearch查询(一)
// 准备数据 PUT /shop/goods/1 {"name": "2017新款女装冬季外套ulzzang棉袄中长款棉衣韩版百搭棉服面包服","d ...
最新文章
- java图形用户界面添加背景颜色不成功的解决方案
- py文件打包或apk_Python文件打包成exe很简单,如果安卓手机也能运行的软件你会吗...
- wordpress mysql 安装_wordpress 搭建安装教程 1 安装数据库、SQLyog
- 格莱泽检验matlab,计量经济学实验指导书
- 敏捷方法在测试计划中的应用
- Python猜字游戏(用函数)(最新版)
- L3-002. 堆栈-PAT团体程序设计天梯赛GPLT(树状数组)
- 线性规划 (二) 单纯形法
- Ajax_jquery库中Ajax方法的使用
- apache部署mo_python
- Java面向对象的三大特征
- 二路归并排序和基数排序
- 在线象棋游戏php网站源码分享
- 决策树CART 代价复杂度剪枝
- 人脸识别可视化项目实现过程Bug记录
- 河北软件职业技术学院计算机专业在哪个校区,河北软件职业技术学院有几个校区,哪个校区最好及各校区介绍...
- CentOS7.6系统安装步骤
- 随着新日益增多的技术,如何正确的提升自己?
- tomcat服务器一直自动关,项目在tomcat里运行一段时间总是自动崩掉的问题排查与解决...
- Linux搭建FTP,并使用Windows和IE浏览器访问FTP服务