ElasticsearchElasticsearch入门


备注

Elasticsearch是一个基于Lucene并使用Java编写的高级开源搜索服务器。

它提供了可通过HTTP REST API访问的分布式完整和部分文本,基于查询和基于地理位置的搜索功能。

版本

发布日期
5.2.1 2017年2月14日
5.2.0 2017年1月31日
5.1.2 2017年1月12日
5.1.1 2016年12月8日
5.0.2 2016年11月29日
5.0.1 2016年11月15日
5.0.0 2016年10月26日
2.4.0 2016年8月31日
2.3.0 2016年3月30日
2.2.0 2016年2月2日
2.1.0 2015年11月24日
2.0.0 2015年10月28日
1.7.0 2015-07-17
1.6.0 2015-06-25
1.5.0 2015年3月6日
1.4.0 2014年11月5日
1.3.0 2014年7月23日
1.2.0 2014年5月22日
1.1.0 2014年3月25日
1.0.0 2014年2月14日

基本搜索参数示例:

默认情况下,完整索引文档作为所有搜索的一部分返回。这被称为源(搜索命中中的_source 字段)。如果我们不希望返回整个源文档,我们只能请求返回源中的几个字段,或者我们可以将_source 设置为false以完全省略该字段。

此示例显示如何从搜索中返回两个字段, account_numberbalance (在_source 内部):

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}'
 

请注意,上面的示例只是简化了_source 字段中返回的信息。它仍然只返回一个名为_source 的字段,但只包含字段account_numberbalance

如果您来自SQL背景,则上述内容在概念上与SQL查询有些相似

SELECT account_number, balance FROM bank;
 

现在让我们转到查询部分。以前,我们已经看到match_all 查询如何用于匹配所有文档。现在让我们介绍一个称为匹配查询的新查询,它可以被认为是一个基本的现场搜索查询(即针对特定字段或字段集进行的搜索)。

此示例返回account_number 设置为20 的帐户:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "account_number": 20 } }
}'
 

此示例返回address 包含术语“mill”的所有帐户:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "address": "mill" } }
}'
 

这个例子返回一个包含术语“磨”或“通道”的所有帐户address

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "address": "mill lane" } }
}'
 

此示例是matchmatch_phrase )的变体, match_phrase 查询拆分为术语,并仅返回包含address 中相对于彼此相同位置的所有术语的文档[1]

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_phrase": { "address": "mill lane" } }
}'
 

我们现在介绍bool(ean)查询。 bool查询允许我们使用布尔逻辑将较小的查询组成更大的查询。

此示例组成两个匹配查询,并返回地址中包含“mill”和“lane”的所有帐户:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'
 

在上面的示例中,bool must 子句指定所有必须为true的查询才能将文档视为匹配项。

相反,此示例组成两个匹配查询并返回address 包含“mill”或“lane”的所有帐户:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'
 

在上面的示例中,bool should 子句指定了一个查询列表,其中任何一个查询都必须为true才能将文档视为匹配项。

此示例组成两个匹配查询,并返回address 既不包含“mill”也不包含“lane”的所有帐户:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'
 

在上面的示例中,bool must_not子句指定了一个查询列表,对于文档而言,这些查询都不能为true。

我们可以在bool查询中同时组合must,should和must_not子句。此外,我们可以在任何这些bool子句中组合bool查询来模仿任何复杂的多级布尔逻辑。

此示例返回属于40岁且不住在华盛顿(简称WA )的人的所有帐户:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "WA" } }
      ]
    }
  }
}'
 

索引和检索文档

Elasticsearch通过HTTP REST API访问,通常使用cURL库。搜索服务器和客户端(您或您的应用程序)之间的消息以JSON字符串的形式发送。默认情况下,Elasticsearch在端口9200上运行。

在下面的示例中,添加了?pretty 以告诉Elasticsearch美化JSON响应。在应用程序中使用这些端点时,无需添加此查询参数。

索引文档

如果我们打算稍后更新索引中的信息,最好为我们索引的文档分配唯一的ID。要将文档添加到名为megacorp 的索引中,请使用类型employee 和ID 1 运行:

curl -XPUT "http://localhost:9200/megacorp/employee/1?pretty" -d'
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}' 
 

响应:

{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "1",
  "_version": 1,
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

 

如果在发送PUT调用时它不存在,则创建索引。

没有ID的索引

POST /megacorp/employee?pretty
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}
 

响应:

{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "AVYg2mBJYy9ijdngfeGa",
  "_version": 1,
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "created": true
}

 

检索文件

curl -XGET "http://localhost:9200/megacorp/employee/1?pretty"
 

响应:

{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "first_name": "John",
    "last_name": "Smith",
    "age": 25,
    "about": "I love to go rock climbing",
    "interests": [
      "sports",
      "music"
    ]
  }
}

 

从类型为employeemegacorp 索引中获取10个文档:

curl -XGET "http://localhost:9200/megacorp/employee/_search?pretty"
 

响应:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 1,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "AVYg2mBJYy9ijdngfeGa",
        "_score": 1,
        "_source": {
          "first_name": "Jane",
          "last_name": "Smith",
          "age": 32,
          "about": "I like to collect rock albums",
          "interests": [
            "music"
          ]
        }
      }
    ]
  }
}

 

使用match 查询进行简单搜索,该查询在提供的字段中查找完全匹配:

curl -XGET "http://localhost:9200/megacorp/employee/_search" -d'
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}'
 

响应:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.6931472,
    "hits": [
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 0.6931472,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      }
    ]
  }
}

 

在CentOS 7上安装Elasticsearch和Kibana

要运行Elasticsearch,计算机上需要Java Runtime Environment(JRE)。 Elasticsearch需要Java 7或更高Oracle JDK version 1.8.0_73 并建议使用Oracle JDK version 1.8.0_73

因此,请确保您的系统中是否有Java。如果没有,请按照以下步骤操作:

# Install wget with yum 
yum -y install wget

# Download the rpm jre-8u60-linux-x64.rpm for 64 bit 
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jre-8u60-linux-x64.rpm"

# Download the rpm jre-8u101-linux-i586.rpm for 32 bit
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jre-8u101-linux-i586.rpm"

# Install jre-.*.rpm
rpm -ivh jre-.*.rpm
 

Java现在应该安装在centOS系统中。您可以查看:

java -version
 

下载并安装elasticsearch

# Download elasticsearch-2.3.5.rpm 
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.5/elasticsearch-2.3.5.rpm

# Install elasticsearch-.*.rpm
rpm -ivh elasticsearch-.*.rpm   
 

在启动时将elasticsearch作为systemd服务运行

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

# check the current status to ensure everything is okay.
systemctl status elasticsearch
 

安装Kibana

首先在rpm上导入GPG密钥

sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
 

然后创建一个本地存储库kibana.repo

sudo vi /etc/yum.repos.d/kibana.repo 
 

并添加以下内容:

[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
 

现在按照以下命令安装kibana:

yum -y install kibana
 

从以下开始:

systemctl start kibana
 

检查状态:

systemctl status kibana
 

您可以将其作为启动服务运行。

systemctl enable kibana
 

在Ubuntu 14.04上安装Elasticsearch


先决条件

要运行Elasticsearch,计算机上需要Java Runtime Environment(JRE)。 Elasticsearch需要Java 7或更高Oracle JDK version 1.8.0_73 并建议使用Oracle JDK version 1.8.0_73

安装Oracle Java 8

sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections
sudo apt-get install -y oracle-java8-installer
 

检查Java版本

java -version
 

下载并安装包

使用二进制文件

  1. 此处下载最新的稳定版Elasticsearch。
  2. 解压缩文件并运行

Linux的:

$ bin/elasticsearch
 

使用apt-get

从网站下载elasticsearch的另一种方法是使用apt-get 安装它。

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://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
sudo /etc/init.d/elasticsearch start
 

安装elasticsearch版本5.x.

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
sudo apt-get update && sudo apt-get install elasticsearch
 

在Linux上作为服务运行:

安装完成后上面不会自动启动。所以我们需要把它作为一项服务来启动。如何启动或停止Elasticsearch取决于您的系统是使用SysV init还是systemd。您可以使用以下命令进行检查。

ps -p 1
 

如果您的发行版使用SysV init,那么您将需要运行:

sudo update-rc.d elasticsearch defaults 95 10
sudo /etc/init.d/elasticsearch start
 

否则,如果您的发行版使用systemd:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
 

从浏览器或REST客户端运行CURL 命令,以检查是否已正确安装Elasticsearch。

curl -X GET http://localhost:9200/
 

在Windows上安装Elasticsearch

先决条件

可以从以下链接获取Windows版本的Elasticsearch: https//www.elastic.co/downloads/elasticsearch 。最新的稳定版本始终位于顶部。

当我们在Windows上安装时,我们需要.ZIP 存档。单击“ Downloads: 部分中的链接,然后将文件保存到您的计算机。

此弹性版本是“可移植的”,这意味着您无需运行安装程序即可使用该程序。将文件的内容解压缩到您可以轻松记住的位置。为了演示,我们假设您将所有内容解压缩到C:\elasticsearch

请注意,默认情况下,存档包含名为elasticsearch-<version> 的文件夹,您可以将该文件夹解压缩到C:\ 并将其重命名为elasticsearch 或自己创建C:\elasticsearch ,然后仅解压缩存档中文件夹的内容到那里

因为Elasticsearch是用Java编写的,所以它需要Java Runtime Environment才能运行。因此,在运行服务器之前,通过打开命令提示符并键入以下内容来检查Java是否可用:

java -version
 

你应该得到一个如下所示的响应:

java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) Client VM (build 25.91-b14, mixed mode)
 

如果您看到以下内容

'java'不被识别为内部或外部命令,可操作程序或批处理文件。

Java未安装在您的系统上或未正确配置。您可以按照本教程 (重新)安装Java。另外,请确保将这些环境变量设置为类似的值:

变量
JAVA_HOME C:\ Program Files \ Java \ jre
路径 ...; C:\ Program Files \ Java \ jre

如果您还不知道如何检查这些变量,请参阅本教程

从批处理文件运行

安装Java后,打开bin 文件夹。它可以直接在解压缩所有内容的文件夹中找到,因此它应该在c:\elasticsearch\bin 。在此文件夹中有一个名为elasticsearch.bat 的文件,可用于在命令窗口中启动Elasticsearch。这意味着进程记录的信息将在命令提示符窗口中显示。要停止服务器,请按CTRL C或只关闭窗口。

作为Windows服务运行

理想情况下,您不希望在开发期间无法使用额外的窗口,因此,可以将Elasticsearch配置为作为服务运行。

在我们将Elasticsearch作为服务安装之前,我们需要在文件C:\elasticsearch\config\jvm.options

服务安装程序要求在安装服务之前在jvm.options 配置线程堆栈大小设置。在32位Windows上,您应该添加-Xss320k [...],在64位Windows上,您应该将-Xss1m 添加到jvm.options 文件中。 [资源]

完成更改后,打开命令提示符并通过运行以下命令导航到bin 目录:

C:\Users\user> cd c:\elasticsearch\bin
 

服务管理由elasticsearch-service.bat 处理。在旧版本中,此文件可能只是名为service.bat 。要查看所有可用参数,请运行它而不:

C:\elasticsearch\bin> elasticsearch-service.bat

Usage: elasticsearch-service.bat install|remove|start|stop|manager [SERVICE_ID]
 

输出还告诉我们有一个可选的SERVICE_ID 参数,但我们现在可以忽略它。要安装该服务,只需运行:

C:\elasticsearch\bin> elasticsearch-service.bat install
 

安装服务后,您可以使用相应的参数启动和停止它。要启动该服务,请运行

C:\elasticsearch\bin> elasticsearch-service.bat start
 

并阻止它,运行

C:\elasticsearch\bin> elasticsearch-service.bat stop
 

如果您更喜欢使用GUI来管理服务,则可以使用以下命令:

C:\elasticsearch\bin> elasticsearch-service.bat manager
 

这将打开Elastic Service Manager,它允许您使用第一个选项卡底部的按钮自定义一些与服务相关的设置以及停止/启动服务。