分布式搜索ElasticSearch構建集群與簡單搜索實例應用


關於ElasticSearch不介紹了,直接說應用.

分布式ElasticSearch集群構建的方法.

1.通過在程序中創建一個嵌入es節點(Node),使之成為es集群的一部分,然后通過這個節點來與es集群通信.

/**在運行該測試實例時,已經在本地建立了對應的索引庫datum*/
    public static void main(String[] args) { //當你啟動一個節點,它會自動加入同網段的es集群,一個前提就是es的集群名(cluster.name)這個參數要設置一致。
        String clusterName = "elasticsearch_pudp"; //集群結點名稱
        
        /** * 默認的話啟動一個節點,es集群會自動給它分配一些索引的分片,如果你想這個節點僅僅作為一個客戶端而不去保存數據, * 你就可以設置把node.data設置成false或 node.client設置成true。 */ Node node = NodeBuilder.nodeBuilder().clusterName(clusterName).client(true).node(); //啟動結點,加入到指定集群
 node.start(); //獲取節點搜索端,使用prepareGet搜索datum索引庫中 索引類型為datum,的索引記錄唯一id值為150得記錄
        GetResponse response = node.client().prepareGet("datum", "datum", ""+150).execute().actionGet(); //對象映射模型
        ObjectMapper mapper = new ObjectMapper(); //將搜索結果response中的值轉換成指定的對象模型,Datum是自己建立的一個咨詢Model對象
        Datum datum= mapper.convertValue(response.getSource(), Datum.class); //打印檢索結果中獲取的對象相應的屬性
        System.out.println("資訊標題:"+datum.getTitle() ); //關閉結點
 node.close(); }

程序運行結果:

資訊標題:波立維與泰嘉片哪個治療血栓病效果更好呢

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

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

  

2.用TransportClient這個接口和es集群通信.

集群中綁定結點

通過TransportClient這個接口,我們可以不啟動節點就可以和es集群進行通信,它需要指定es集群中其中一台或多台機的ip地址和端口

        Client client = new TransportClient() .addTransportAddress(new InetSocketTransportAddress("192.168.0.149", 9300)) .addTransportAddress(new InetSocketTransportAddress("192.168.0.162", 9300)); client.close(); 

集群名稱如果我們不更改,默認的為elasticsearch,ElasticSearch對應的目錄elasticsearch\config\下的elasticsearch.yml文件中.如下位置 

################################### Cluster ################################### # Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
# cluster.name: elasticsearch

 

程序中自定義集群結點名稱

    /**在運行該測試實例時,已經在本地建立了對應的索引庫datum*/
    public static void main(String[] args) { //自定義集群結點名稱
        String clusterName = "elasticsearch_pudongping"; //程序中更改集群結點名稱
        Settings settings = ImmutableSettings.settingsBuilder() .put("cluster.name", clusterName).build(); //創建集群,綁定集群內的機器
        TransportClient client = new TransportClient(settings); client.addTransportAddress(new InetSocketTransportAddress("192.168.0.149", 9300)); client.addTransportAddress(new InetSocketTransportAddress("192.168.0.162", 9300)); //搜索
        GetResponse response = client.prepareGet("datum", "datum", ""+130) .execute() .actionGet(); ObjectMapper mapper = new ObjectMapper(); Datum datum= mapper.convertValue(response.getSource(), Datum.class); System.out.println("資訊標題:"+datum.getTitle() ); //關閉結點
 client.close(); }

程序運行結果:

資訊標題:捷諾維主要成份有哪些 療效怎么樣

設置屬性使客戶端去嗅探整個集群的狀態

可以設置client.transport.sniff為true來使客戶端去嗅探整個集群的狀態

        /** * 可以設置client.transport.sniff為true來使客戶端去嗅探整個集群的狀態, * 把集群中其它機器的ip地址加到客戶端中,這樣做的好處是一般你不用手動設置集群里所有集群的ip到連接客戶端, * 它會自動幫你添加,並且自動發現新加入集群的機器。 */ Settings settings = ImmutableSettings.settingsBuilder() .put("client.transport.sniff", true).build(); TransportClient client = new TransportClient(settings);

 

實例應用: 

使用TransportClient初始化客戶端並執行簡單搜索:

package com.bbf.client; import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.map.ObjectMapper; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import com.bbf.search.model.Datum; /** * description: * * @author <a href='mailto:dennisit@163.com'> Cn.pudp (En.dennisit)</a> Copy Right since 2013-9-29 * * com.bbf.client.ESClient.java * */

public class ESClient { /**在運行該測試實例時,已經在本地建立了對應的索引庫datum*/
    public static void main(String[] args) { //自定義集群結點名稱
        String clusterName = "elasticsearch_pudongping"; //程序中更改集群結點名稱 並且設置client.transport.sniff為true來使客戶端去嗅探整個集群的狀態
        Settings settings = ImmutableSettings.settingsBuilder() .put("cluster.name", clusterName).put("client.transport.sniff", true).build(); //創建客戶端對象
        TransportClient client = new TransportClient(settings); //客戶端對象初始化集群內結點,綁定多個ip //client.addTransportAddress(new InetSocketTransportAddress("192.168.0.149", 9300));
        client.addTransportAddress(new InetSocketTransportAddress("192.168.0.162", 9300)); //搜索,根據Id查詢
        GetResponse response = client.prepareGet("datum", "datum", ""+130) .execute() .actionGet(); //查詢結果映射成對象類
        ObjectMapper mapper = new ObjectMapper(); Datum datum= mapper.convertValue(response.getSource(), Datum.class); System.out.println("資訊編號:" + datum.getId() +"\t資訊標題:"+datum.getTitle() ); //構造查詢器查詢,第一個參數為要查詢的關鍵字,第二個參數為要檢索的索引庫中的對應索引類型的域
        QueryBuilder query = QueryBuilders.multiMatchQuery("恩必普", "keyword"); //第一個參數datum表示索引庫,第二個參數datum表示索引類型,from表示開始的位置 size表示查詢的條數 ,類似mysql中的limit3,5
        SearchResponse searchResponse = client.prepareSearch("datum").setTypes("datum").setQuery(query).setFrom(3).setSize(5).execute().actionGet(); //將搜索結果轉換為list集合對象
        List<Datum> lists  = getBeans(searchResponse); System.out.println("查詢出來的結果數:" + lists.size()); for(Datum dtm: lists){ System.out.println("資訊編號:" + dtm.getId() +"\t資訊標題:"+dtm.getTitle()); } //關閉客戶端
 client.close(); } /** * 從查詢到的記錄中獲取json串值,轉換成<code>Datum</code>對象 * * @author <a href='mailto:dennisit@163.com'> Cn.pudp (En.dennisit)</a> Copy Right since 2013-9-24 下午09:24:29 * * @param response * 查詢結果集<code>GetResponse</code> * @return * 返回<code>Datum</code>對象 */
    public static Datum getResponseToObject(GetResponse response){ ObjectMapper mapper = new ObjectMapper(); return mapper.convertValue(response.getSource(), Datum.class); } /** * 將查詢到的對象集合封裝成List集合 * * @author <a href='mailto:dennisit@163.com'>Cn.pudp(En.dennisit)</a> Copy Right since 2013-9-27 下午02:31:26 * * @param response * @return
     */
    public static List<Datum> getBeans(SearchResponse response) { SearchHits hits = response.getHits(); ObjectMapper mapper = new ObjectMapper(); List<Datum> datumList = new ArrayList<Datum>(); for (SearchHit hit : hits) { String json = hit.getSourceAsString(); Datum dtm = new Datum(); try { dtm = mapper.readValue(json, Datum.class); datumList.add(dtm); } catch (Exception e) { e.printStackTrace(); } } return datumList; } }

 程序運行結果:

資訊編號:130 資訊標題:捷諾維主要成份有哪些 療效怎么樣 查詢出來的結果數:5 資訊編號:16 資訊標題:恩必普是不是醫保葯 可以報銷嗎 資訊編號:11 資訊標題:恩必普的治療范圍 有什么優勢 資訊編號:17 資訊標題:恩必普的作用機制是什么 資訊編號:12 資訊標題:恩必普服用有什么禁忌 注意事項哪些 資訊編號:20    資訊標題:中風可以用恩必普嗎

 

 轉載請注明出處:[http://www.cnblogs.com/dennisit/p/3346228.html]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM