1. 程式人生 > >Elasticsearch(二)elasticsearch索引資料與簡單檢索GET一個文件

Elasticsearch(二)elasticsearch索引資料與簡單檢索GET一個文件

本文參考elasticsearch權威指南。
是一個學習筆記,按照裡面的示例進行學習,在此記錄跟蹤。

與elasticsearch互動的兩種方式

JAVA API

如果你和我一樣,使用java,在程式碼中你可以使用 Elasticsearch 內建的兩個客戶端:

節點客戶端(Node client)

節點客戶端作為一個非資料節點加入到本地叢集中。換句話說,它本身不儲存任何資料,但是它知道資料在叢集中的哪個節點中,並且可以把請求轉發到正確的節點。

傳輸客戶端(Transport client)

輕量級的傳輸客戶端可以可以將請求傳送到遠端叢集。它本身不加入叢集,但是它可以將請求轉發到叢集中的一個節點上。

兩個 Java 客戶端都是通過 9300 埠並使用本地 Elasticsearch 傳輸 協議和叢集互動。叢集中的節點通過埠 9300 彼此通訊。如果這個埠沒有開啟,節點將無法形成一個叢集。
PS:Java 客戶端作為節點必須和 Elasticsearch 有相同的 主要 版本;否則,它們之前將無法互相理解。即客戶端使用的版本要與伺服器相對應。

推薦使用傳輸客戶端,下面是一個連線客戶端的小例子:

Settings settings = Settings.builder().put("cluster.name", "bdrg")//叢集名稱
.put("client.transport.sniff"
, true)//sniff功能 .put("client.transport.ping_timeout","100s")//連線超時 .build(); TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));//連線IP和PORT

RESTFUL API WITH JSON OVER HTTP

所有其他語言可以使用 RESTful API 通過埠 9200 和 Elasticsearch 進行通訊,你可以用你最喜愛的 web 客戶端訪問 Elasticsearch 。事實上,正如你所看到的,你甚至可以使用 curl 命令來和 Elasticsearch 互動。
Elasticsearch 為以下語言提供了官方客戶端 –Groovy、JavaScript、.NET、 PHP、 Perl、 Python 和 Ruby–還有很多社群提供的客戶端和外掛,所有這些都可以在 Elasticsearch Clients 中找到。

一個 Elasticsearch 請求和任何 HTTP 請求一樣由若干相同的部件組成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

被 < > 標記的部件:
VERB :
適當的 HTTP 方法 或 謂詞 : GETPOSTPUTHEAD 或者 DELETE
PROTOCOL:
http 或者 https(如果你在 Elasticsearch 前面有一個https 代理)
HOST :
Elasticsearch 叢集中任意節點的主機名,或者用 localhost 代表本地機器上的節點。
PORT :
執行 Elasticsearch HTTP 服務的埠號,預設是 9200 。
PATH :
API 的終端路徑(例如 _count 將返回叢集中文件數量)。Path 可能包含多個元件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING :
任意可選的查詢字串引數 (例如 ?pretty 將格式化地輸出 JSON 返回值,使其更容易閱讀)
BODY :
一個 JSON 格式的請求體 (如果請求需要的話)

例如,計算叢集中文件的數量,我們可以用這個:

curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}

Elasticsearch 返回一個 HTTP 狀態碼(例如:200 OK)和(除HEAD請求)一個 JSON 格式的返回值。前面的curl 請求將返回一個像下面一樣的 JSON 體:

{
    "count" : 0,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    }
}

在返回結果中沒有看到 HTTP 頭資訊是因為我們沒有要求curl顯示它們。想要看到頭資訊,需要結合-i 引數來使用 curl 命令:

curl -i -XGET 'localhost:9200/'

面向文件

假如一個User物件其中包含了另一個地址物件,關係型資料庫不能放在一個地方,需要放在另一張表中。elasticsearch卻吧User包含的地址也放在User當中,因為它根據文件來索引資料。

對文件進行索引、檢索、排序和過濾–而不是對行列資料。這是一種完全不同的思考資料的方式,也是 Elasticsearch 能支援複雜全文檢索的原因。

例如一個JSON 文件,它代表了一個 user 物件:

{
    "email":      "[email protected]",
    "first_name": "John",
    "last_name":  "Smith",
    "info": {
        "bio":         "Eco-warrior and defender of the weak",
        "age":         25,
        "interests": [ "dolphins", "whales" ]
    },
    "join_date": "2014/05/01"
}

雖然原始的 user 物件很複雜,但這個物件的結構和含義在 JSON 版本中都得到了體現和保留。在 Elasticsearch 中將物件轉化為 JSON 並做索引要比在一個扁平的表結構中做相同的事情簡單的多。

幾乎所有的語言都有相應的模組可以將任意的資料結構或物件 轉化成 JSON 格式,只是細節各不相同。具體請檢視 serialization 或者 marshalling 這兩個 處理 JSON 的模組。官方 Elasticsearch 客戶端 自動為您提供 JSON 轉化。

下面是一個elasticsearch自動提供json轉化的示例:

XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .field("vehicleId", "BCAAAD0005")
                .endObject();
String json4 =  builder.string();
System.out.println(json4);

顯示如下:

{"vehicleId":"BCAAAD0005"}

接下來我們學習怎樣操作資料,以一個僱員目錄為例:
我們受僱於 Megacorp 公司,作為 HR 部門新的 “熱愛無人機” (“We love our drones!”)激勵專案的一部分,我們的任務是為此建立一個僱員目錄。該目錄應當能培養僱員認同感及支援實時、高效、動態協作,因此有一些業務需求:
• 支援包含多值標籤、數值、以及全文字的資料
• 檢索任一僱員的完整資訊
• 允許結構化搜尋,比如查詢 30 歲以上的員工
• 允許簡單的全文搜尋以及較複雜的短語搜尋
• 支援在匹配文件內容中高亮顯示搜尋片段
• 支援基於資料建立和管理分析儀表盤

建立僱員文件

也稱索引僱員文件。
第一個業務需求就是儲存僱員資料。 這將會以 僱員文件 的形式儲存:一個文件代表一個僱員。儲存資料到 Elasticsearch 的行為叫做 索引 ,但在索引一個文件之前,需要確定將文件儲存在哪裡。
一個 Elasticsearch 叢集可以 包含多個 索引(類比資料庫) ,相應的每個索引可以包含多個 型別 (類比表)。 這些不同的型別儲存著多個 文件 (類比資料),每個文件又有 多個 屬性 (類比欄位)。

對於僱員目錄,我們將做如下操作:
• 每個僱員索引一個文件,包含該僱員的所有資訊。
• 每個文件都將是 employee 型別 。
• 該型別位於 索引 megacorp 內。
• 該索引儲存在我們的 Elasticsearch 叢集中。
實踐中這非常簡單(儘管看起來有很多步驟),我們可以通過一條命令完成所有這些動作:

PUT /megacorp/employee/1
{
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}

注意,路徑 /megacorp/employee/1 包含了三部分的資訊:
megacorp 索引名稱
employee 型別名稱
1 特定僱員的ID
請求體 —— JSON 文件 —— 包含了這位員工的所有詳細資訊,他的名字叫 John Smith ,今年 25 歲,喜歡攀巖。

很簡單!無需進行執行管理任務,如建立一個索引或指定每個屬性的資料型別之類的,可以直接只索引一個文件。Elasticsearch 預設地完成其他一切,因此所有必需的管理任務都在後臺使用預設設定完成。
進行下一步前,讓我們增加更多的員工資訊到目錄中:
PUT /megacorp/employee/2
{
“first_name” : “Jane”,
“last_name” : “Smith”,
“age” : 32,
“about” : “I like to collect rock albums”,
“interests”: [ “music” ]
}

PUT /megacorp/employee/3
{
“first_name” : “Douglas”,
“last_name” : “Fir”,
“age” : 35,
“about”: “I like to build cabinets”,
“interests”: [ “forestry” ]
}

用客戶端連線的方式完成以上操作的示例

POM檔案

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

        <!-- <dependency>
             <groupId>org.elasticsearch</groupId>
             <artifactId>elasticsearch</artifactId>
             <version>2.2.0</version>
        </dependency> -->

         <dependency>
          <groupId>org.elasticsearch.client</groupId>
          <artifactId>transport</artifactId>
          <version>5.3.0</version>
        </dependency> 

        <!-- logger for client -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.9.1</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.6</version>
        </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.6</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.6</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.8</version>
    </dependency>



  </dependencies>

其中如果你的elasticsearch伺服器沒有對應的客戶端傳輸org.elasticsearch.client,請使用類似於2.0.0版本的依賴。

initData.java–客戶端連線

public class InitialData {
    private static Logger logger = (Logger) LogManager.getLogger(InitialData.class);
    /**
     * 獲得連線
     * @param clusterName 叢集名稱
     * @param sniff 是否增加嗅探功能
     * @param time 設定超時時間
     * @param ip 連線IP
     * @param port 連線port,傳輸埠一般都是9300
     * @return
     * @throws UnknownHostException 
     */
    public static Client connect(String clusterName,boolean sniff,int time,String ip,int port) throws UnknownHostException {

        //叢集名稱 -- 預設"elasticsearch"
        String cluster = null;
        if(null == clusterName || ("").equals(clusterName.trim())) {
            cluster = "elasticsearch";
        }else {
            cluster = clusterName;
        }

        //是否增加嗅探功能
        //連線超時時間 -- 最小5s
        if(time < 5) {
            time = 5;
        }

        Settings settings = Settings.builder().put("cluster.name", cluster)//叢集名稱
                .put("client.transport.sniff", sniff)//sniff功能
                .put("client.transport.ping_timeout",time+"s")//連線超時時限
                .build();
        TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip),port));//連線IP和PORT

        logger.info("連線成功...");
        return client;
    }
}

ClientDemo2 .java–模擬僱員示例

public class ClientDemo2 {

    /*
     * 索引僱員文件,相當於我們傳統資料庫的insert操作
     * 對於僱員目錄,我們將做如下操作:
         每個僱員索引一個文件,包含該僱員的所有資訊。  --doc
         每個文件都將是  employee 型別 。  --type
         該型別位於 索引 megacorp 內。  --index
         該索引儲存在我們的 Elasticsearch 叢集中。 
     */
    private static void insertEmployee (Client client) throws Exception{
        //1.插入第一個員工,員工id為1,插在當前叢集下的megacorp索引(類比資料庫)employee型別(類比表)下
        IndexResponse response = client.prepareIndex("megacorp","employee","1")//index  type  id(表特定僱員)
                .setSource(XContentFactory.jsonBuilder()
                            .startObject()
                                .field("first_name","John")
                                .field("last_name","Smith")
                                .field("age",25)
                                .field("about","I love to go rock climbing")
                                .array("interests", new String[] {"sports","music"})
                            .endObject()).get();
        //索引名稱
        String _index = response.getIndex();
        //鍵入名稱
        String _type = response.getType();
        //檔案ID(生成與否)
        String _id = response.getId();
        //版本(如果這是您首次索引此文件,您將獲得:1)--- 每次執行版本數都會+1
        long _version = response.getVersion();
        // status has stored current instance statement。
        RestStatus status = response.status();
        System.out.println("index:"+_index+";type:"+_type+";id:"+_id+";version:"+_version+";status:"+status);//
        System.out.println(response.getResult().toString());//第一次執行是CREATED,同一個id第二次開始是UPDATED

        //2.插入第二個員工
        //你也可以手工寫入自己的json
        String json ="{"+
                "\"first_name\":\"Jane\","+
                "\"last_name\":\"Smith\","+
                "\"age\":\"32\","+
                "\"about\":\"I like to collect rock albums\","+
                "\"interests\":[\"music\"]"+
           "}";

        IndexResponse response2 = client.prepareIndex("megacorp","employee","2")
            .setSource(json,XContentType.JSON)
            .get();

        System.out.println(response2.getResult().toString());//CREATED

        //3.插入第三個員工,不想獲得結果可以直接呼叫
        client.prepareIndex("megacorp","employee","3")//index  type  id(表特定僱員)
                .setSource(XContentFactory.jsonBuilder()
                    .startObject()
                        .field("first_name","Douglas")
                        .field("last_name","Fir")
                        .field("age",35)
                        .field("about","I like to build cabinets")
                        .array("interests", "forestry")
                    .endObject()).get();
    }


    public static void main(String[] args) {

        // 獲得客戶端連線
        Client client = null;
        try {
            client = InitialData.connect("bdrg", true, 100, "127.0.0.1", 9300);


            // 1.索引僱員文件
            insertEmployee (client);
        } catch (UnknownHostException e) {
            System.out.println("伺服器地址錯誤:"+e.getMessage());
        } catch (Exception e) {
            System.out.println("客戶端操作錯誤:"+e.getMessage());
            e.printStackTrace();
        } finally {
            // 關閉客戶端
            if(null != client) {
                client.close();
            }
        }


    }


}

可以多次執行,插入操作第一次會執行插入,第二次或以上會執行為更新操作。

結果顯示:
no modules loaded
loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
loaded plugin [org.elasticsearch.transport.Netty3Plugin]
loaded plugin [org.elasticsearch.transport.Netty4Plugin]
連線成功…
index:megacorp;type:employee;id:1;version:5;status:OK
UPDATED
UPDATED

Head外掛操作示例

這裡寫圖片描述

再次點選:

這裡寫圖片描述

看我們索引中的資料:

這裡寫圖片描述

我們的interets資料呢?

這裡寫圖片描述

(還可以選擇json格式的,只有table格式的出不來)
它沒有表示成一個欄位顯示出來。也很符合邏輯。

簡單檢索一個文件

目前我們已經在 Elasticsearch 中儲存了一些資料, 接下來就能專注於實現應用的業務需求了。第一個需求是可以檢索到單個僱員的資料。
這在 Elasticsearch 中很簡單。簡單地執行 一個 HTTP GET 請求並指定文件的地址——索引庫、型別和ID。 使用這三個資訊可以返回原始的 JSON 文件:

GET /megacorp/employee/1

返回結果包含了文件的一些元資料,以及 _source 屬性,內容是 John Smith 僱員的原始 JSON 文件:

{
  "_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" ]
  }
}

用客戶端連線的方式完成以上操作的示例

接著上一個示例中寫,我們增加一個檢索方法:

main方法中增加呼叫

// 1.索引僱員文件
//insertEmployee(client);

// 2.簡單檢索一個文件  GET
getOneEmployee(client,"megacorp","employee","1");

增加的方法

/* 簡單檢索一個文件  GET
     * 簡單地執行  一個 HTTP GET 請求並指定文件的地址——索引庫、型別和ID。    使用這三個資訊可以返回原始的 JSON 文件:
     * {
          "_index" :   "megacorp",
          "_type" :    "employee",
          "_id" :      "1",
          "_version" : 5,
          "found" :    true,
          "_source" :  {
              "first_name" :  "John",
              "last_name" :   "Smith",
              "age" :         25,
              "about" :       "I love to go rock climbing",
              "interests":  [ "sports", "music" ]
          }
        }
     */
    private static void getOneEmployee(Client client,String index,String type,String id)throws Exception {
        GetResponse response3 = client.prepareGet(index, type, id).execute().actionGet();
        System.out.println(response3.getSourceAsString());//這是_source部分
        //{"first_name":"John","last_name":"Smith","age":25,"about":"I love to go rock climbing","interests":["sports","music"]}
        System.out.println(response3.getIndex()+"--"+response3.getType()+"--"+response3.getId()+"--"+response3.getVersion());
    }

結果顯示:
連線成功…
{“first_name”:”John”,”last_name”:”Smith”,”age”:25,”about”:”I love to go rock climbing”,”interests”:[“sports”,”music”]}
megacorp–employee–1—5

Head外掛操作示例

這裡寫圖片描述

相關推薦

Elasticsearchelasticsearch索引資料簡單檢索GET一個

本文參考elasticsearch權威指南。 是一個學習筆記,按照裡面的示例進行學習,在此記錄跟蹤。 與elasticsearch互動的兩種方式 JAVA API 如果你和我一樣,使用java,在程式碼中你可以使用 Elasticsearch 內建的

搜尋引擎elasticsearch--http介面資料操作

一、簡介這裡將介紹,通過http請求,對es進行索引和資料操作。es中使用的是REST api方式,即通知http的方法不同來執行不同的操作。操作主要有兩塊,一是對索引本身的操作;二是對索引資料的操作。都包含了增刪改查操作。二、操作這裡直接上程式碼,解釋請參考註釋。#!/us

虛擬內存內存映射區別聯系

程序 指令 ref 知識庫 緩沖 網站架構 文件的 計算機 聯系   虛擬內存與內存映射文件是操作系統內存管理的重要部分,二者有相似也有不同的地方,本文是作者學習與應用中得到的一些體會,有錯誤的地方,請提點。 二者的聯系:虛擬內存與內存映射文件都是將一部分內容加載的內存,另

24Python實現遞歸生成或者刪除一個目錄及

path 生成 std fun created elif ror spa else import os,errno #基本工具類 #①遞歸生成輸入的路徑下面的文件夾或文件 #②遞歸刪除輸入的路徑下面的文件夾及文件 ‘‘‘ param : dirPath return :

Elasticsearch 通關教程索引對映Mapping問題

資料庫建表的時候,我們的DDL語句一般都會指定每個欄位的儲存型別,例如:varchar,int,datetime等等,目的很明確,就是更精確的儲存資料,防止資料型別格式混亂。 CREATE TABLE `shop_` ( `id_` varchar(36) NOT NULL COMMENT 'id',

ElasticSearch學習總結:ES介紹架構說明

本文主要從概念以及架構層面對Elasticsearch做一個簡單的介紹,在介紹ES之前,會先對ES的“發動機”Lucene做一個簡單的介紹 1. Lucene介紹 為了更深入地理解ElasticSearch的工作原理,特別是索引和查詢這兩個過程,理解Lucene的工作原理至關重要。本

win環境下把MySql中的資料匯入到Elasticsearch

環境問題參考我上文: 環境問題已經好了,接下來,我們講實戰。 該壓縮包幫助mysql與其他平臺連線。看到很多資源都要積分,不能選0分,所以選1分了 在bin目錄下建立jdbc.config 根據需求改連線,賬號,密碼,名字,埠等等。 input {

Yii2整合Elasticsearch

背景知識: 全文搜尋可以簡單地分為兩類,一種是順序掃描,即我們常見的使用 like %keyword% 方式,掃描整張資料表,在每一條記錄中查詢;另一種就是索引掃描。elasticsearch就是後者。 索引掃描分為兩部分:建立索引和搜尋索引。建立索引的主要步驟是:對原資料進行分詞處

Elasticsearch學習Elasticsearch核心概念

核心概念 (1)Near Realtime(NRT):近實時,兩個意思,從寫入資料到資料可以被搜尋到有一個小延遲(大概1秒);基於es執行搜尋和分析可以達到秒級 (2)Cluster:叢集,包含多個節點,每個節點屬於哪個叢集是通過一個配置(叢集名稱,預設是elasticsearc

elasticsearchjava 使用同步步方法進行查詢操作

一、 基本步驟: 1)建立連線物件: RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(

深入理解ElasticSearch索引管理

索引管理 1、建立一個索引 到目前為止, 我們已經通過索引一篇文件建立了一個新的索引 。這個索引採用的是預設的配置,新的欄位通過動態對映的方式被新增到型別對映。現在我們需要對這個建立索引的過程做更多的控制:我們想要確保這個索引有數量適中的主分片,並且在我們索引任何資料 之

Elasticsearch基礎API

叢集健康 curl localhost:9200/_cat/health?v epoch timestamp cluster status node.total node.data shards pri relo init unassi

windows 10 在docker下安裝elasticsearch

ElasticSearch6.3版本中增加了elasticsearch sql, 最近為了研究elasticsearch sql,突發奇想的想在docker中安裝es。 本文主要介紹的就是在windo

資料結構之順序佇列鏈佇列

順序佇列 運用陣列結構來構建的線性佇列就是順序佇列。 本例實現了順序佇列的入隊、出隊、判斷隊空、初始化佇列、列印佇列等操作。 #include<iostream> using namespace std; const int m=1000; struct

ElasticSearch教程——ElasticSearch基本外掛head

公司一直在使用ES作為分散式的搜尋引擎,由於資料量的不斷升高,ES出現了效能瓶頸。公司決定進一步的優化ES配置,所以最近幾天在研究ES,最近會更新一系列ES的教程,希望大家持續關注。不多說了,Action。 前言 這篇文章我們介紹一個非常好的工具:ela

ElasticSearchKibana、版本控制

Kibana簡介:   Kibana視覺化介面 Kibana是一個開源的分析和視覺化平臺,設計用於和Elasticsearch一起工作。 你用Kibana來搜尋,檢視,並和儲存在Elasticsearch索引中的資料進行互動。 你可以輕鬆地執行高階資料分析,並且以各種圖示、表格和地圖的形式視覺化資料。 Ki

小微企業阿里雲最佳實踐系列:RDS 資料庫DMS 資料庫管理資料管理

關聯博文小微企業阿里雲最佳實踐系列(一):ECS 伺服器與 RDS 資料庫 概述 閱讀物件 本博文主要寫給創業團隊、技術團隊人數 < 5 人、沒有專業運維等小微企業作為參考,需要掌握基礎的伺服器管理、軟體開發等經驗。 博文主要內容 在上一篇博文中主要介紹了 ECS 伺服器與 RDS 資料庫,在

ElasticSearch 菜鳥筆記ElasticSearch 安裝

環境 Red Hat 4.4.7-4 ElasticSearch 5.1.1 java 1.8.0_40 環境說明:ElasticSearch 在跳躍到版本號 5.1.1 之後 ,要求 java 版本號至少為 1.8 。

Elasticsearch:使用JAVA API實現簡單查詢、聚合查詢

ES版本:2.3.1 JDK:1.8 所需要的jar包請在ES安裝路徑下的jars包中獲得,不要使用其他的jar否則容易出現版本問題! 注意:程式碼中TransportClient client=ESLink.getTransportClient()

Elasticsearch2索引詳談

  在上一篇部落格中,介紹了ES中的一些核心概念和ES、Kibana安裝方法。本節開始,我們從索引開始來學習ES的操作方法。   1 建立索引¶   建立一個索引的方法很簡單,在Kibana中執行下行請求即可建立一個名為“i