Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建并开源维护的。它的开源代码位于https://github.com/elastic/elasticsearch。同时,Elastic公司也拥有Logstash及Kibana开源项目。这个三个开源项目组合在一起,就形成了 ELK软件栈。他们三个共同形成了一个强大的生态圈。简单地说,Logstash负责数据的采集,处理(丰富数据,数据转型等),Kibana负责数据展,分析及管理。Elasticsearch处于最核心的位置,它可以帮我们对数据进行快速地搜索及分析。
ELK Stack应用场景:
事实上Elasticsearch的完整栈有如下的几个:
Beats是一些轻量级可以允许在客户端服务器中的代理。它并不需要部署到我们的Elastic云中。它可以帮我们收集所有需要的事件。如果把beats也纳入到我的架构中,那么Elastic的栈可以表述为:
数据采集流程:
在今天的这篇文章中,我来简单地介绍一下什么是Elasticsearch。
Elastic围绕Elasticsearch已经建立了许多成熟的方案。更多详情请参阅我们的官方网站https://www.elastic.co/。
简单地说, Elaaticsearch是一个分布式的使用REST接口的搜索引擎。它的产品可以在https://www.elastic.co/products/elasticsearch进行下载。Elasticsearch是一个分布式的基于REST接口的为云而设计的搜索引擎,它的功能包括:
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。Lucene本身并不提供高可用性及分布式部署。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Lucene非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。
Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。
不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:
而且,所有的这些功能被集成到一台服务器,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。上手Elasticsearch非常简单,它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。Elasticsearch在Apache 2 license下许可使用,可以免费下载、使用和修改。
随着知识的积累,你可以根据不同的问题领域定制Elasticsearch的高级特性,这一切都是可配置的,并且配置非常灵活。
Elasticsearch的特点是它提供了一个极速的搜索体验。这源于它的高速(speed)。相比较其它的一些大数据引擎,Elasticsearch可以实现秒级的搜索,但是对于它们来说,可能需要数小时才能完成。Elasticsearch的cluster是一种分布式的部署,极易扩展(scale)。这样很容易使它处理petabytes的数据库容量。最重要的是Elasticsearch是它搜索的结果可以按照分数进行排序,它能提供我们最相关的搜索结果(relevance)。
首先,不要恐慌。 获得Elasticsearch的全部内容需要5分钟。
你需要在你的电脑上安装最新的Java。你可查看setup链接得到更多的信息。
在我们的terminal上我们可以打人如下的命令:
$ curl -XGET 'http://localhost:9200/' -H 'Content-Type: application/json'
如果你看到如下的内容,表面我们的elasticsearch已经安装正确:
以后我们可以安装Elastic所提供的安全插件,那么我们可以通过如下的命令来做这个:
$ curl -GET -u "elastic:changeme" 'http://localhost:9200/' -H 'Content-Type: application/json'
这里 -u 选项可以帮我们设置用户名及密码来登录我们的elasticsearch。在以后的章节里我们会介绍如何安装并使用安全的插件。
让我们尝试索引一些类似于Twitter的信息。 首先,让我们索引一些推文(将自动创建twitter索引):
curl -XPUT 'http://localhost:9200/twitter/_doc/1?pretty' -H 'Content-Type: application/json' -d '
{
"user": "kimchy",
"post_date": "2009-11-15T13:12:00",
"message": "Trying out Elasticsearch, so far so good?"
}'
curl -XPUT 'http://localhost:9200/twitter/_doc/2?pretty' -H 'Content-Type: application/json' -d '
{
"user": "kimchy",
"post_date": "2009-11-15T14:12:12",
"message": "Another tweet, will it be indexed?"
}'
curl -XPUT 'http://localhost:9200/twitter/_doc/3?pretty' -H 'Content-Type: application/json' -d '
{
"user": "elastic",
"post_date": "2010-01-15T01:46:38",
"message": "Building the site, should be kewl"
}'
现在,让我们检查一下上面的信息是否已经通过我上面的操作加入到索引里。我们可以通过GET来查询:
curl -XGET 'http://localhost:9200/twitter/_doc/1?pretty=true'
curl -XGET 'http://localhost:9200/twitter/_doc/2?pretty=true'
curl -XGET 'http://localhost:9200/twitter/_doc/3?pretty=true'
让我们找到kimchy发布的所有推文:
curl -XGET 'http://localhost:9200/twitter/_search?q=user:kimchy&pretty=true'
我们还可以使用Elasticsearch提供的JSON查询语言而不是查询字符串:
curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query" : {
"match" : { "user": "kimchy" }
}
}'
上面的查询将会显示所有的由kimchy发布的所有tweet。为了好玩,让我们来得到所有的存储的文档(document) (我们可以看到由用户elastic发布的所有的tweet).
curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query" : {
"match_all" : {}
}
}'
我们也可以做一个范围里的搜索(刚才上面的那个post_date在建立索引的时候已经自动被识别为date类型)
curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query" : {
"range" : {
"post_date" : { "from" : "2009-11-15T13:00:00", "to" : "2009-11-15T14:00:00" }
}
}
}'
还有更多的选项可以执行搜索,毕竟,这是一个搜索产品吗? 所有熟悉的Lucene查询都可以通过JSON查询语言或查询解析器获得。
伙计,那个twitter索引可能会变大(在这种情况下,索引大小==估值)。 让我们看看我们是否可以稍微改变我们的tweet系统,以支持如此大量的数据。
Elasticsearch支持多个索引。 在前面的示例中,我们使用了一个名为twitter的索引,该索引为每个用户存储了推文。
定义我们简单的推特系统的另一种方法是为每个用户提供不同的索引(注意,尽管每个索引都有开销)。 这是这种情况下的索引curl:
curl -XPUT 'http://localhost:9200/kimchy/_doc/1?pretty' -H 'Content-Type: application/json' -d '
{
"user": "kimchy",
"post_date": "2009-11-15T13:12:00",
"message": "Trying out Elasticsearch, so far so good?"
}'
curl -XPUT 'http://localhost:9200/kimchy/_doc/2?pretty' -H 'Content-Type: application/json' -d '
{
"user": "kimchy",
"post_date": "2009-11-15T14:12:12",
"message": "Another tweet, will it be indexed?"
}'
以上将索引信息到kimchy索引中。 每个用户都将获得自己的特殊索引。
允许完全控制索引级别。 例如,在上面的情况中,我们可能希望从每个索引1个副本的默认1分片更改为每个索引1个副本的2个分片(因为此用户推文很多)。 以下是如何做到这一点(配置也可以是在yaml文件里配置):
curl -XPUT http://localhost:9200/another_user?pretty -H 'Content-Type: application/json' -d '
{
"settings" : {
"index.number_of_shards" : 2,
"index.number_of_replicas" : 1
}
}'
搜索(和类似操作)具有多索引感知功能。 这意味着我们可以轻松搜索多个index(twitter用户),例如:
curl -XGET 'http://localhost:9200/kimchy,another_user/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query" : {
"match_all" : {}
}
}'
或者在所有的索引(index)里进行搜索:
curl -XGET 'http://localhost:9200/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query" : {
"match_all" : {}
}
}'
{One liner teaser}:关于那个很酷的部分? 您可以轻松搜索多个Twitter用户(索引),每个用户具有不同的提升级别(索引),使社交搜索变得更加简单(我朋友的结果排名高于我朋友的朋友的结果)。
Elasticsearch是一个高度可用的分布式搜索引擎。每个索引都分解为碎片,每个碎片可以有一个或多个副本。默认情况下,创建一个索引,每个分片有1个分片和1个副本(1/1)。可以使用许多拓扑,包括1/10(提高搜索性能)或20/1(提高索引性能)。
为了使用Elasticsearch的分布式特性,只需启动更多节点并关闭节点。系统将继续为索引的最新数据提供请求(确保使用正确的http端口)。
我们刚刚介绍了Elasticsearch的一小部分内容。有关更多信息,请参阅elastic.co网站。一般问题可以在elastic论坛上或在#elasticsearch的Freenode上的IRC上询问。 Elasticsearch GitHub存储库仅用于错误报告和功能请求。
Elasticsearch使用Gradle作为其构建系统。
要创建分发,只需在克隆目录中运行./gradlew汇编命令。
将在该项目的build / distributions目录下创建每个项目的分发。
有关运行Elasticsearch测试套件的更多信息,请参阅TESTING文件。
为了确保从早期版本的Elasticsearch顺利升级过程,请参阅我们的升级文档以获取有关升级过程的更多详细信息。