ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,所以您值得拥有。 在本教程中,将介绍开始使用ElasticSearch的一些主要概念。

下载并运行ElasticSearch

ElasticSearch可以从https:///cn/downloads/下载对应的文件格式,如ZIPTAR.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入门教程_Elasticsearch
启动 ElasticSearch

D:\elasticsearch-5.2.0>cd bin

D:\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 [] 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 plugins
 loaded
[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/,效果如下图所示
Elasticsearch入门教程_Elasticsearch_02

使用REST API与Sense

ElasticSearch的实例并运行,您可以使用localhost:9200,基于JSON的REST API与ElasticSearch进行通信。使用任何HTTP客户端来通信。在ElasticSearch自己的文档中,所有示例都使用curl。 但是,当使用API时也可使用图形客户端(如FiddlerRESTClient),这样操作起更方便直观一些。

更方便的是Chrome插件Sense。 Sense提供了一个专门用于使用ElasticSearch的REST API的简单用户界面。 它还具有许多方便的功能,例如:ElasticSearch的查询语法的自动完成功能以及curl格式的复制和粘贴请求,从而可以方便地在文档中运行示例。

我们将在本教程中使用sense来执行curl请求,建议安装Sense并使用它学习后续文章内容。
安装完成后,在Chrome的右上角找到Sense的图标。 第一次单击它运行Sense时,会为您准备一个非常简单的示例请求。如下图所示
Elasticsearch入门教程_Elasticsearch_03
上述请求将执行最简单的搜索查询,匹配服务器上所有索引中的所有文档。针对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部分是可选的。如果不指定IDElasticSearch会为我们生成一个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入门教程_Elasticsearch_04
执行请求后,可以看到接收到来自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。响应结果如下
Elasticsearch入门教程_Elasticsearch_05

版本号(_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''

执行结果如下所示 -
Elasticsearch入门教程_Elasticsearch_06
正如上图所看到的,结果对象包含与索引时所看到的类似的元数据,如索引,类型和版本信息。 最后最重要的是,它有一个名称为“_source”的属性,它包含实际获取的文档信息。
关于GET没有什么可说的,因为它很简单,继续最后删除操作.

删除文档

为了通过ID从索引中删除单个指定的文档,使用与获取索引文档相同的URL,只是这里将HTTP方法更改为DELETE

curl -XDELETE "http://localhost:9200/movies/movie/1" -d''

响应对象包含元数据方面的一些常见数据字段,以及名为“_found”的属性,表示文档确实已找到并且操作成功。
Elasticsearch入门教程_Elasticsearch_07
在执行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。其中,indextype都是可选的。

换句话说,为了搜索电影,可以对以下任一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"
        }
    }
}'

执行上面的请求并查看结果,如下所示
Elasticsearch入门教程_Elasticsearch_08
再看看另一种情况,在特定字段中搜索。

指定搜索的字段

这样的设置称为“fields”,可用于指定要搜索的字段列表。如果不使用“fields”字段,ElasticSearch查询将默认自动生成的名为“_all”的特殊字段,来基于所有文档中的各个字段匹配搜索。
为了做到这一点,修改以前的搜索请求正文,以便查询字符串查询有一个fields属性用来要搜索的字段数组:

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "ford",     //指定搜索字段的值
            "fields": ["title"]    //指定搜索字段
        }
    }
}'

执行上面查询它,看看会有什么结果(应该只匹配到 1 条数据):
Elasticsearch入门教程_Elasticsearch_09
正如预期的得到一个命中,电影的标题中的单词“ford”。现在,从查询中移除fields属性,应该能匹配到 3 行数据:
Elasticsearch入门教程_Elasticsearch_10

过滤

前面已经介绍了几个简单的自由文本搜索查询。现在来看看另一个示例,搜索“drama”,不明确指定字段,如下查询

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "drama"
        }
    }
}'

执行结果如下图:
Elasticsearch入门教程_Elasticsearch_11
因为在索引中有五部电影在_all字段(从所有类别字段)中包含单词“drama”,所以得到了上述查询的5个命中。 现在,想象一下,如果我们想限制这些命中为只是1962年发布的电影。要做到这点,需要应用一个过滤器,要求“year”字段等于1962

要添加过滤器,修改搜索请求正文,以便当前的顶级查询(查询字符串查询)包含在过滤的查询中:

POST /_search
{
    "query": {
        "bool": {
            "filter": {
                "query_string": {
                    "query": "drama"
                                }
                       },
              "must": {   
                "match": { "year": 1962 }  //这里填写过滤条件
                      }
        }
    }
}

执行结果如下:当执行上面请求,只得到两个命中,这个两个命中的数据的 year 字段的值都是等于 1962
Elasticsearch入门教程_Elasticsearch_12

无需查询即可进行过滤

下面的match_all指“所有的字段”, 所以下面的代码的意思就是“”对所有的字段都进行过滤条件的查找“”

POST /_search
{
    "query": {
        "bool": {
            "filter": {
                "match_all": {  //对所有字段都进行过滤
                }
            },
            "must": { //过滤条件
                "match": { "year": 1962 }
            }
        }
    }
}

执行结果如下:
Elasticsearch入门教程_Elasticsearch_13
另一个更简单的方法是使用常数分数查询:
讲解:下面的constant_score的作用是“将查找之后的结果按照过滤条件匹配的频率大小来排序,比如某一条记录里面出现"year": 1962,出现了很多次,那么他就优先级更高,优先展示出来”

POST /_search
{
    "query": {
        "constant_score": {
            "filter": {
                "term": { "year": 1962 }
            }
        }      
    }   
}

本文转载自:https://www.yiibai.com/elasticsearch/elasticsearch-getting-start.html