Elasticsearch - Java API(與集羣交互)

1.1. 與集羣交互

可以通過兩種方式來連接到elasticsearch(簡稱es)集羣,第一種是通過在你的程序中創建一個嵌入es節點(Node),使之成爲es集羣的一部分,然後通過這個節點來與es集羣通信。第二種方式是用TransportClient這個接口和es集羣通信。


1.1.1. Node方式

創建嵌入節點的方式如下:


    import static org.elasticsearch.node.NodeBuilder.*;    

    //啓動節點   

    Node node = nodeBuilder().node();   

    Client client = node.client();    

    //關閉節點  

    node.close();  

當你啓動一個節點,它會自動加入同網段的es集羣,一個前提就是es的集羣名(cluster.name)這個參數要設置一致。

默認的話啓動一個節點,es集羣會自動給它分配一些索引的分片,如果你想這個節點僅僅作爲一個客戶端而不去保存數據,你就可以設置把node.data設置成false或 node.client設置成true。下面是例子:

    Node node = nodeBuilder().clusterName(clusterName).client(true).node();   

還有一種情況是你並不想把節點加入集羣,只想用它進行單元測試時,就要啓動一個“本地”的es,這裏“本地”指的是在jvm的級別下運行,即兩個不同的es節點運行在同一個JVM中時會組成一個集羣。它需要把節點的local參數設置成true,下面是例子:

    Node node = nodeBuilder().local(true).node();   


1.1.2. TransportClient方式(較直觀,推薦)

通過TransportClient這個接口,我們可以不啓動節點就可以和es集羣進行通信,它需要指定es集羣中其中一臺或多臺機的ip地址和端口,例子如下:

    Client client = new TransportClient()   

            .addTransportAddress(new InetSocketTransportAddress("host1", 9300))   

            .addTransportAddress(new InetSocketTransportAddress("host2", 9300));   

    client.close();  

    如果你需要更改集羣名(默認是elasticsearch),需要如下設置:

    Settings settings = ImmutableSettings.settingsBuilder()   

                    .put("cluster.name", "myClusterName").build();   

    Client client = new TransportClient(settings);  

你可以設置client.transport.sniff爲true來使客戶端去嗅探整個集羣的狀態,把集羣中其它機器的ip地址加到客戶端中,這樣做的好處是一般你不用手動設置集羣裏所有集羣的ip到連接客戶端,它會自動幫你添加,並且自動發現新加入集羣的機器。代碼實例如下:

    Settings settings = ImmutableSettings.settingsBuilder()   

                    .put("client.transport.sniff", true).build();   

TransportClient client = new TransportClient(settings);


1.2. put Mapping定義索引字段屬性

Mapping,就是對索引庫中索引的字段名及其數據類型進行定義,類似於關係數據庫中表建立時要定義字段名及其數據類型那樣,不過es的mapping比數據庫靈活很多,它可以動態添加字段。一般不需要要指定mapping都可以,因爲es會自動根據數據格式定義它的類型,如果你需要對某些字段添加特殊屬性(如:定義使用其它分詞器、是否分詞、是否存儲等),就必須手動添加mapping。有兩種添加mapping的方法,一種是定義在配置文件中,一種是運行時手動提交mapping,兩種選一種就行了。

先介紹在配置文件中定義mapping,你可以把[mapping名].json文件放到config/mappings/[索引名]目錄下,這個目錄要自己創建,一個mapping和一個索引對應,你也可以定義一個默認的mapping,把自己定義的default-mapping.json放到config目錄下就行。json格式如下:

    {  

       "mappings":{  

          "properties":{  

             "title":{  

                "type":"string",  

                "store":"yes"  

             },  

             "description":{  

                "type":"string",  

                "index":"not_analyzed"  

             },  

             "price":{  

                "type":"double"  

             },  

             "onSale":{  

                "type":"boolean"  

             },  

             "type":{  

                "type":"integer"  

             },  

             "createDate":{  

                "type":"date"  

             }  

          }  

       }  

    }  

當然,也可以通過請求添加mapping,可以在官方文檔中搜索相關api示例。

同時,可以使用elasticssearch的rest api進行CURD(創建/create、檢索/retrieve、更新/update、刪除/delete)操作。HTTP協議中給出了可在API調用中作爲謂詞使用的一個相當長的請求類型列表。全速的選擇是使用GET獲取所請求的對象當前對象,使用POST來改變當前對象的狀態,使用PUT來創建對象,使用DELETE來銷燬對象,另外還有HEAD用於提取對象的基本信息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章