bootwiki-Elasticsearch教程
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
Elasticsearch教程
Elasticsearch 是一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,可以说 Lucene 是当今最先进,最高效的全功能开源搜索引擎框架。
Elasticsearch是基于Apache Lucene的搜索服务器。它由Shay Banon开发并于2010年发布。现在是由Elasticsearch BV负责维护。其最新版本是:5.2.0。
Elasticsearch是一个实时分布式和开源的全文搜索和分析引擎。 它可以从RESTful Web服务接口访问,并使用模式少JSON(JavaScript对象符号)文档来存储数据。它是基于Java编程语言,这使Elasticsearch能够在不同的平台上运行。使用户能够以非常快的速度来搜索非常大的数据量。
www.elastic.co 下载最新的 Elasticsearch,注意选择对应版本 -
- 对于Windows操作系统,请下载ZIP文件。
- 对于UNIX操作系统,请下载TAR文件。
- 对于Debian操作系统,请下载DEB文件。
- 对于Red Hat和其他Linux发行版,请下载RPM文件。
- APT和Yum实用程序也可用于在许多Linux发行版中用来安装Elasticsearch。
第3步 - Elasticsearch的安装过程非常容易,下面介绍在不同的操作系统如何安装 -
- Windows操作系统 ? 解压缩zip包,并安装Elasticsearch。
- UNIX操作系统 - 在任何位置提取tar文件,并安装Elasticsearch。
$tar –xvf elasticsearch-5.2.0.tar.gz -
使用APT实用程序的Linux操作系统 -
下载并安装公共签名密钥 -$ wget -qO - http://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -保存存储库定义 -
$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list运行更新 -
$ sudo apt-get update现在就可以使用以下命令来安装了 -
$ sudo apt-get install elasticsearch -
使用YUM实用程序的Debian Linux操作系统 -
下载并安装公共签名密钥 -$ rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch在“
/etc/yum.repos.d/”目录中用.repo作为后缀在文件中添加以下文本。 例如,在elasticsearch.repo文件中,添加以下文本 -[elasticsearch-5.x] name = Elasticsearch repository for5.x packages baseurl = http://packages.elastic.co/elasticsearch/5.x/centos gpgcheck = 1 gpgkey = http://packages.elastic.co/GPG-KEY-elasticsearch enabled = 1现在可以使用以下命令安装Elasticsearch:
$ yum install elasticsearch第4步 - 进入到Elasticsearch主目录和
bin文件夹。在Windows系统下可运行elasticsearch.bat文件,或者在UNIX rum Elasticsearch文件的情况下,可以使用命令提示符和通过终端执行相同操作。
在Windows中 -
> cd elasticsearch-5.1.0/bin
> elasticsearch
在Linux中 -
$ cd elasticsearch-5.1.0/bin
$ ./elasticsearch
注意 - 在Windows系统中,可能会收到错误,指出未设置
JAVA_HOME,请将环境变量设置为“C:Program FilesJavajre1.8.0_65”或设置实际安装java的位置。
第5步 - Elasticsearch Web界面的默认端口是9200,或者可以通过更改bin目录中的elasticsearch.yml文件中的http.port字段值来更改。可以通过浏览http:// localhost:9200来检查服务器是否已启动并正在运行。如果没有问题,它将返回一个JSON对象,其中包含有关安装的Elasticsearch信息有以下方式 -
{
"name" : "Brain-Child",
"cluster_name" : "elasticsearch", "version" : {
"number" : "5.1.0",
"build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87",
"build_timestamp" : "2015-11-18T22:40:03Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}
第6步 - 可以从 www.telerik.com 安装 fiddler2 作为 Elasticsearch 的前端。
- 在
fiddler2的配置窗口中,您可以点击Elasticsearch的地址添加索引,如果需要,那么类型/映射也使用HTTP POST方法,例如 -- 地址栏 - http://localhost:9200/schools/school
- 请求正文 - 可添加JSON对象,这将获得索引存储。
-
可以使用相同方式来搜索任何东西,只需在URL的结尾处添加“
_search”关键字,并在请求正文中发送一个查询,例如 -- 地址栏 - POST http://localhost:9200/city/schools/_search
- 请求正文 -
{ "query":{ "match_all":{} } }
此查询将返回该索引中属于该特定类型的所有内容。
-
可以通过将相同的URL放在地址栏中,并使用HTTP DELETE方法进行匹配来删除特定的索引或类型。
使用REST API与Sense
当ElasticSearch的实例并运行,您可以使用localhost:9200,基于JSON的REST API与ElasticSearch进行通信。使用任何HTTP客户端来通信。在ElasticSearch自己的文档中,所有示例都使用curl。 但是,当使用API时也可使用图形客户端(如Fiddler或RESTClient),这样操作起更方便直观一些。
更方便的是Chrome插件Sense。 Sense提供了一个专门用于使用ElasticSearch的REST API的简单用户界面。 它还具有许多方便的功能,例如: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": []
}
}
下一步我们来学习添加一些数据和索引,来修复这个问题。
http://localhost:9200/_search - 搜索所有索引和所有类型。
因为我们只有一个单一的索引和单一的类型,所以怎么使用都不会有什么问题。为了简洁起见使用第一个URL。
http://www.elasticsearch.org/guide/reference/query-dsl/
查询字符串查询是一个高级查询,有很多不同的选项,ElasticSearch将解析和转换为更简单的查询树。如果忽略了所有的可选参数,并且只需要给它一个字符串用于搜索,它可以很容易使用。
现在尝试在两部电影的标题中搜索有“kill”这个词的电影信息:
curl -XPOST "http://localhost:9200/_search" -d'
{
"query": {
"query_string": {
"query": "kill"
}
}
}'
执行上面的请求并查看结果,如下所示 -

正如预期的,得到两个命中结果,每个电影的标题中都带有“kill”单词。再看看另一种情况,在特定字段中搜索。
条件过滤器就能很好地完成工作。
"filter": {
"term": { "year": 1962 }
}
"filter": {
"term": { "year": 1962 }
}
完整的搜索请求如下所示:
curl -XPOST "http://localhost:9200/_search" -d'
{
"query": {
"filtered": {
"query": {
"query_string": {
"query": "drama"
}
},
"filter": {
"term": { "year": 1962 }
}
}
}
}'
当执行上面请求,只得到两个命中,这个两个命中的数据的 year 字段的值都是等于 1962。
http://www.elastic.co/ 阅读了解如何更改文档。
| 旧版 | 新版 | 升级方法 |
|---|---|---|
| 0.90.x | 2.x | 完全群集重新启动 |
| 1.x | 2.x | 完全群集重新启动 |
| 2.x | 2.y | 滚动升级(y> x) |
- 在迁移前进行数据备份,并按照说明执行备份过程。 快照和恢复模块可用于进行备份。此模块可用于创建索引或完整集群的快照,并可存储在远程存储库中。
Elasticsearch填充文章中执行。所有其他功能与GET API相同。
Elasticsearch搜索API
此API用于在Elasticsearch中搜索内容。 用户可以通过发送具有查询字符串的获取请求作为参数或在请求的消息正文中的查询来进行搜索。所有的搜索API都是多索引,多类型。
maven来实现此目的,并且可在pom.xml中添加以下内容。
org.elasticsearch
elasticsearch
2.1.0
org.elasticsearch
elasticsearch
2.1.0
EsSetup初始化用来启动和停止Elasticsearch节点,并创建索引。
EsSetup esSetup = new EsSetup();
esSetup.execute()函数与createIndex用于创建索引,需要指定设置,类型和数据。
单元测试
单元测试是通过使用JUnit和Elasticsearch测试框架来进行的。可以使用Elasticsearch类创建节点和索引,并且在测试方法中可以用来执行测试。ESTestCase和ESTokenStreamTestCase类用于此测试。
集成测试
集成测试在集群中使用多个节点。 ESIntegTestCase类用于这种类型的测试。 有多种方法使得准备测试用例的工作更容易。
| 编号 | 方法 | 描述 |
|---|---|---|
| 1 | refresh() | 刷新群集中的所有索引 |
| 2 | ensureGreen() | 确保绿色健康集群状态 |
| 3 | ensureYellow() | 确保黄色的健康群集状态 |
| 4 | createIndex(name) | 使用传递给此方法的名称创建索引 |
| 5 | flush() | 刷新群集中的所有索引 |
| 6 | flushAndRefresh() | 执行 flush() 和 refresh() |
| 7 | indexExists(name) | 验证指定索引是否存在 |
| 8 | clusterService() | 返回集群服务java类 |
| 9 | cluster() | 返回测试集群类 |
测试集群方法
| 编号 | 方法 | 描述 |
|---|---|---|
| 1 | ensureAtLeastNumNodes(n) | 确保群集中最小节点数量大于或等于指定数量。 |
| 2 | ensureAtMostNumNodes(n) | 确保群集中最大节点数小于或等于指定数。 |
| 3 | stopRandomNode() | 停止集群中的随机节点 |
| 4 | stopCurrentMasterNode() | 停止主节点 |
| 5 | stopRandomNonMaster() | 停止集群中的随机节点(不是主节点) |
| 6 | buildNode() | 创建一个新节点 |
| 7 | startNode(settings) | 启动一个新节点 |
| 8 | nodeSettings() | 覆盖此方法以更改(更新)节点设置 |
访问客户端
客户端用于访问集群中的不同节点并执行某些操作。ESIntegTestCase.client()方法用于获取随机客户端。Elasticsearch还提供了其他方法来访问客户端,这些方法可以使用ESIntegTestCase.internalCluster()方法访问。
| 编号 | 方法 | 描述 |
|---|---|---|
| 1 | iterator() | 这用于访问所有可用的客户端。 |
| 2 | masterClient() | 返回一个正在与主节点通信的客户端。 |
| 3 | nonMasterClient() | 返回一个不与主节点通信的客户端。 |
| 4 | clientNodeClient() | 将返回当前在客户端节点上的客户端。 |
随机测试
随机测试是用于使用所有可能的数据测试用户的代码,以便将来不会出现任何类型的数据失败。 随机数据是进行此测试的最佳选择。
生成随机数据
在这个测试中,Random类由RandomizedTest提供的实例实例化,并提供了许多方法来获取不同类型的数据。
| 方法 | 返回值 |
|---|---|
| getRandom() | 随机类的实例 |
| randomBoolean() | 随机布尔值 |
| randomByte() | 随机字节值 |
| randomShort() | 随机短整型值 |
| randomInt() | 随机整型值 |
| randomLong() | 随机长整型值 |
| randomFloat() | 随机浮点值 |
| randomDouble() | 随机双精度浮点值 |
| randomLocale() | 随机区域设置 |
| randomTimeZone() | 随机时区 |
| randomFrom() | 数组中的随机元素 |
断言
ElasticsearchAssertions和ElasticsearchGeoAssertions类包含断言,用于在测试时执行一些常见检查。 例如,
SearchResponse seearchResponse = client().prepareSearch();
assertHitCount(searchResponse, 6);
assertFirstHit(searchResponse, hasId("6"));
assertSearchHits(searchResponse, "1", "2", "3", "4",”5”,”6”);