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,它允許您使用第一個選項卡底部的按鈕自定義一些與服務相關的設置以及停止/啟動服務。