elasticsearch2.3.3 java client demo

轉載自:http://blog.csdn.net/hunanlzg/article/details/51658370html

本文包含的內容java

1.安裝elasticsearch2.3.3linux

2.配置ik中文分詞器git

3.使用Java api 對document進行CRUDgithub


1.安裝

建議在linux 下(若是是windows直接去https://www.elastic.co/downloads/elasticsearch下載 zip包也能夠)
下面以linux環境爲例子

由於es不能跑在root下面,因此咱們要本身新建一個用戶。這個我就很少說了。
還有就是避免下面出現一些權限問題,能夠考慮 直接 chmod -R 777 elasticsearch-2.3.3 反正是學習,先上手在說。

安裝es
[plain] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. curl -L -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz  
解壓
[plain] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. tar -xvf elasticsearch-2.3.3.tar.gz  
進入bin目錄
[plain] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. cd elasticsearch-2.3.3/bin  
啓動
[plain] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. ./elasticsearch  

若是能看到下面信息,說明成功了(每一個人的 名字多是不同的)

新開一個會話窗口,以前的那個用於啓動es了。
檢查節點健康
[plain] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. curl 'localhost:9200/_cat/health?v'  

stauts 是綠色說明OK。
進過上面的步驟,es已經安裝而且運行起來了。

可是如今是在虛擬機中的Linux運行的。直接訪問  你的ip:9200  應該是打開不了的。
須要在 
/es根目錄/config/elasticsearch.yml  的最後面加上
network.host: 0.0.0.0

重啓在訪問  你的ip:9200  應該就能看到一個簡單的網頁了。

記得 關閉linux的防火牆哦(學習的時候這樣簡單粗暴點。)

2.配置ik中文分詞器

由於要用es來進行全文檢索,因此對應的中文分詞器也不能少了。問了不少人都是推薦使用ik分詞器。因此我就拿來用了。
已經有大神將ik封裝成了es的一個插件  git 地址: https://github.com/medcl/elasticsearch-analysis-ik

按照git上面的步驟(建議你們看下,用不了幾分鐘的)
將git項目 下載下來 mvn package 一下。
拿到 target/releases/elasticsearch-analysis-ik-2.3.3.zip 下的zip包 放到你剛剛 安裝 es的 根目錄下的 plugins/ik 文件夾中。
默認沒有ik文件夾,咱們須要本身建一個。
而後 解壓 unzip elasticsearch-analysis-ik-2.3.3.zip
結果以下:


重啓es
其實就是 ctrl+c 先中止
再用 啓動
[plain] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. ./elasticsearch  

能看到ik字樣,說明OK了。

3.使用java api 進行簡單的 操做

新建一個maven工程
pom.xml
[html] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1.  <dependencies>  
  2.    <dependency>  
  3.      <groupId>junit</groupId>  
  4.      <artifactId>junit</artifactId>  
  5.      <version>4.11</version>  
  6.      <scope>test</scope>  
  7.    </dependency>  
  8.    <dependency>  
  9.     <groupId>org.elasticsearch</groupId>  
  10.     <artifactId>elasticsearch</artifactId>  
  11.     <version>2.3.3</version>  
  12. </dependency>  
  13.   
  14. <dependency>  
  15.     <groupId>com.fasterxml.jackson.core</groupId>  
  16.     <artifactId>jackson-databind</artifactId>  
  17.     <version>2.6.6</version>  
  18. </dependency>  
  19.   
  20.  </dependencies>  

一共三個類,以下

[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. package cn.lzg.esdemo;  
  2.   
  3. public class Goods {  
  4.     private Long id;  
  5.     private String name;  
  6.     private String[] regionIds;  
  7.       
  8.     public Goods() {  
  9.         super();  
  10.     }  
  11.       
  12.     public Goods(Long id, String name, String[] regionIds) {  
  13.         super();  
  14.         this.id = id;  
  15.         this.name = name;  
  16.         this.regionIds = regionIds;  
  17.     }  
  18.   
  19.     public Long getId() {  
  20.         return id;  
  21.     }  
  22.     public void setId(Long id) {  
  23.         this.id = id;  
  24.     }  
  25.     public String getName() {  
  26.         return name;  
  27.     }  
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.   
  32.     public String[] getRegionIds() {  
  33.         return regionIds;  
  34.     }  
  35.   
  36.     public void setRegionIds(String[] regionIds) {  
  37.         this.regionIds = regionIds;  
  38.     }  
  39.   
  40.   
  41.     @Override  
  42.     public String toString() {  
  43.         return id+" : " + name + " : "+regionIds;  
  44.     }  
  45. }  


[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. package cn.lzg.esdemo;  
  2.   
  3. /** 
  4.  * 用於es查詢的dto 
  5.  *  
  6.  * @author lzg 
  7.  * @date 2016年6月12日 
  8.  */  
  9. public class GoodsFilter2ES {  
  10.     private String regionId; // 園區UUID  
  11.   
  12.     private String queryStr; // 條件  
  13.   
  14.     public String getRegionId() {  
  15.         return regionId;  
  16.     }  
  17.   
  18.     public void setRegionId(String regionId) {  
  19.         this.regionId = regionId;  
  20.     }  
  21.   
  22.     public String getQueryStr() {  
  23.         return queryStr;  
  24.     }  
  25.   
  26.     public void setQueryStr(String queryStr) {  
  27.         this.queryStr = queryStr;  
  28.     }  
  29. }  


這是用java api 對index document的簡單的CRUD操做。
[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. package cn.lzg.esdemo;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.InetAddress;  
  5. import java.net.UnknownHostException;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8.   
  9. import org.elasticsearch.action.bulk.BulkItemResponse;  
  10. import org.elasticsearch.action.bulk.BulkRequestBuilder;  
  11. import org.elasticsearch.action.bulk.BulkResponse;  
  12. import org.elasticsearch.action.index.IndexRequest;  
  13. import org.elasticsearch.action.search.SearchResponse;  
  14. import org.elasticsearch.client.Client;  
  15. import org.elasticsearch.client.transport.TransportClient;  
  16. import org.elasticsearch.common.transport.InetSocketTransportAddress;  
  17. import org.elasticsearch.index.query.BoolQueryBuilder;  
  18. import org.elasticsearch.index.query.QueryBuilder;  
  19. import org.elasticsearch.index.query.QueryBuilders;  
  20. import org.elasticsearch.search.SearchHit;  
  21.   
  22. import com.fasterxml.jackson.core.JsonParseException;  
  23. import com.fasterxml.jackson.core.JsonProcessingException;  
  24. import com.fasterxml.jackson.databind.JsonMappingException;  
  25. import com.fasterxml.jackson.databind.ObjectMapper;  
  26.   
  27. /** 
  28.  * elasticsearch 相關操做工具類 
  29.  *  
  30.  * @author lzg 
  31.  * @date 2016年6月12日 
  32.  */  
  33. public class ESUtils {  
  34.   
  35.   
  36.     /** 
  37.      * es服務器的host 
  38.      */  
  39.     private static final String host = "192.168.1.88";  
  40.   
  41.     /** 
  42.      * es服務器暴露給client的port 
  43.      */  
  44.     private static final int port = 9300;  
  45.   
  46.     /** 
  47.      * jackson用於序列化操做的mapper 
  48.      */  
  49.     private static final ObjectMapper mapper = new ObjectMapper();  
  50.   
  51.     /** 
  52.      * 得到鏈接 
  53.      *  
  54.      * @return 
  55.      * @throws UnknownHostException 
  56.      */  
  57.     private static Client getClient() throws UnknownHostException {  
  58.         Client client = TransportClient.builder().build()  
  59.                 .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));  
  60.         return client;  
  61.     }  
  62.   
  63.     /** 
  64.      * 建立商品索引 
  65.      *  
  66.      * @param goodsList 
  67.      *            商品dto的列表 
  68.      * @throws UnknownHostException 
  69.      * @throws JsonProcessingException 
  70.      */  
  71.     public static void createIndex(List<Goods> goodsList) throws UnknownHostException, JsonProcessingException {  
  72.         Client client = getClient();  
  73.         // 若是存在就先刪除索引  
  74.         if (client.admin().indices().prepareExists("test_index").get().isExists()) {  
  75.             client.admin().indices().prepareDelete("test_index").get();  
  76.         }  
  77.         // 建立索引,並設置mapping.  
  78.         String mappingStr = "{ \"goods\" : { \"properties\": { \"id\": { \"type\": \"long\" }, \"name\": {\"type\": \"string\", \"analyzer\": \"ik_max_word\"}, \"regionIds\": {\"type\": \"string\",\"index\": \"not_analyzed\"}}}}";  
  79.         client.admin().indices().prepareCreate("test_index").addMapping("goods", mappingStr).get();  
  80.   
  81.         // 批量處理request  
  82.         BulkRequestBuilder bulkRequest = client.prepareBulk();  
  83.   
  84.         byte[] json;  
  85.         for (Goods goods : goodsList) {  
  86.             json = mapper.writeValueAsBytes(goods);  
  87.             bulkRequest.add(new IndexRequest("test_index", "goods", goods.getId() + "").source(json));  
  88.         }  
  89.   
  90.         // 執行批量處理request  
  91.         BulkResponse bulkResponse = bulkRequest.get();  
  92.   
  93.         // 處理錯誤信息  
  94.         if (bulkResponse.hasFailures()) {  
  95.             System.out.println("====================批量建立索引過程當中出現錯誤 下面是錯誤信息==========================");  
  96.             long count = 0L;  
  97.             for (BulkItemResponse bulkItemResponse : bulkResponse) {  
  98.                 System.out.println("發生錯誤的 索引id爲 : "+bulkItemResponse.getId()+" ,錯誤信息爲:"+ bulkItemResponse.getFailureMessage());  
  99.                 count++;  
  100.             }  
  101.             System.out.println("====================批量建立索引過程當中出現錯誤 上面是錯誤信息 共有: "+count+" 條記錄==========================");  
  102.         }  
  103.   
  104.         client.close();  
  105.     }  
  106.   
  107.     /** 
  108.      * 查詢商品 
  109.      *  
  110.      * @param filter 
  111.      * @return 
  112.      * @throws JsonParseException 
  113.      * @throws JsonMappingException 
  114.      * @throws IOException 
  115.      */  
  116.     public static List<Goods> search(GoodsFilter2ES filter)  
  117.             throws JsonParseException, JsonMappingException, IOException {  
  118.         Client client = getClient();  
  119.         QueryBuilder qb = new BoolQueryBuilder()  
  120.                 .must(QueryBuilders.matchQuery("name",filter.getQueryStr()))  
  121.                 .must(QueryBuilders.termQuery("regionIds", filter.getRegionId()));  
  122.   
  123.         SearchResponse response = client.prepareSearch("test_index").setTypes("goods").setQuery(qb).execute()  
  124.                 .actionGet();  
  125.   
  126.         SearchHit[] hits = response.getHits().getHits();  
  127.         List<Goods> goodsIds = new ArrayList<>();  
  128.         for (SearchHit hit : hits) {  
  129.             Goods goods = mapper.readValue(hit.getSourceAsString(), Goods.class);  
  130.             goodsIds.add(goods);  
  131.         }  
  132.   
  133.         client.close();  
  134.         return goodsIds;  
  135.     }  
  136.   
  137.     /** 
  138.      * 新增document 
  139.      *  
  140.      * @param index 
  141.      *            索引名稱 
  142.      * @param type 
  143.      *            類型名稱 
  144.      * @param goods 
  145.      *            商品dto 
  146.      * @throws UnknownHostException 
  147.      * @throws JsonProcessingException 
  148.      */  
  149.     public static void addDocument(String index, String type, Goods goods)  
  150.             throws UnknownHostException, JsonProcessingException {  
  151.         Client client = getClient();  
  152.   
  153.         byte[] json = mapper.writeValueAsBytes(goods);  
  154.   
  155.         client.prepareIndex(index, type, goods.getId() + "").setSource(json).get();  
  156.   
  157.         client.close();  
  158.     }  
  159.   
  160.     /** 
  161.      * 刪除document 
  162.      *  
  163.      * @param index 
  164.      *            索引名稱 
  165.      * @param type 
  166.      *            類型名稱 
  167.      * @param goodsId 
  168.      *            要刪除的商品id 
  169.      * @throws UnknownHostException 
  170.      */  
  171.     public static void deleteDocument(String index, String type, Long goodsId) throws UnknownHostException {  
  172.         Client client = getClient();  
  173.   
  174.         client.prepareDelete(index, type, goodsId+"").get();  
  175.   
  176.         client.close();  
  177.     }  
  178.   
  179.     /** 
  180.      * 更新document 
  181.      *  
  182.      * @param index 
  183.      *            索引名稱 
  184.      * @param type 
  185.      *            類型名稱 
  186.      * @param goods 
  187.      *            商品dto 
  188.      * @throws JsonProcessingException 
  189.      * @throws UnknownHostException 
  190.      */  
  191.     public static void updateDocument(String index, String type, Goods goods)  
  192.             throws UnknownHostException, JsonProcessingException {  
  193.         //若是新增的時候index存在,就是更新操做  
  194.         addDocument(index, type, goods);  
  195.     }  
  196.   
  197. }  



下面來寫單元測試看看結果(最後會放出測試類的全代碼)
[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. @Test  
  2.     public void testCreatIndex() throws UnknownHostException, JsonProcessingException{  
  3.         List<Goods> goodsList = new ArrayList<>();  
  4.           
  5.         String[] r123 = {"r1","r2","r3"};  
  6.         String[] r23 = {"r2","r3"};  
  7.         goodsList.add(new Goods(1L, "雀巢咖啡", r123));  
  8.         goodsList.add(new Goods(2L, "雀巢咖啡", r23));  
  9.           
  10.         goodsList.add(new Goods(3L, "星巴克咖啡", r123));  
  11.         goodsList.add(new Goods(4L, "可口可樂", r123));  
  12.           
  13.         ESUtils.createIndex(goodsList);  
  14.     }  
上面的方法是 添加4個數據,而後生成索引


咱們在linux下 查看節點下的索引
'localhost:9200/_cat/indices?v'


發現有 test_index 這個索引了,並且索引下面是4個document。說明咱們index構建成功。至於健康狀態爲yellow,是由於咱們如今只有一個節點。他的數據沒地方備份。準確的說法,你們去官網查看吧。大概是這個意思。


test查詢
[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. @Test  
  2.     public void testSearch() throws JsonParseException, JsonMappingException, IOException{  
  3.         GoodsFilter2ES filter = new GoodsFilter2ES();  
  4.         filter.setQueryStr("咖啡");  
  5.         filter.setRegionId("r2");  
  6.         List<Goods> result = ESUtils.search(filter);  
  7.         for (Goods goods : result) {  
  8.             System.out.println(goods);  
  9.         }  
  10.     }  

結果以下:


其餘狀況你們本身動手測試吧。

新增document
[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. @Test  
  2.     public void testAddDoc() throws UnknownHostException, JsonProcessingException{  
  3.         //test_index 和 goods 在建立索引的時候寫死了 因此這樣 就傳這兩個值  
  4.         String[] r = {"r2","r3"};  
  5.         Goods goods = new Goods(5L, "新增的咖啡", r);  
  6.         ESUtils.addDocument("test_index", "goods", goods);  
  7.     }  
junit執行成功後,在執行上面的查詢結果以下

說明成功了。 下面的修改和刪除我測試了是沒問題的。就不貼圖了。

最後發上測試的完整類

[java] view plain copy
 
在CODE上查看代碼片派生到個人代碼片
  1. package cn.lzg.esdemo;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.UnknownHostException;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import org.junit.Test;  
  9.   
  10. import com.fasterxml.jackson.core.JsonParseException;  
  11. import com.fasterxml.jackson.core.JsonProcessingException;  
  12. import com.fasterxml.jackson.databind.JsonMappingException;  
  13.   
  14. public class MyTest {  
  15.       
  16.     /** 
  17.      * 生成索引 
  18.      * @throws UnknownHostException 
  19.      * @throws JsonProcessingException 
  20.      */  
  21.     @Test  
  22.     public void testCreatIndex() throws UnknownHostException, JsonProcessingException{  
  23.         List<Goods> goodsList = new ArrayList<>();  
  24.           
  25.         String[] r123 = {"r1","r2","r3"};  
  26.         String[] r23 = {"r2","r3"};  
  27.         goodsList.add(new Goods(1L, "雀巢咖啡", r123));  
  28.         goodsList.add(new Goods(2L, "雅哈咖啡", r23));  
  29.           
  30.         goodsList.add(new Goods(3L, "星巴克咖啡", r123));  
  31.         goodsList.add(new Goods(4L, "可口可樂", r123));  
  32.           
  33.         ESUtils.createIndex(goodsList);  
  34.     }  
  35.       
  36.     /** 
  37.      * 測試search 
  38.      * @throws JsonParseException 
  39.      * @throws JsonMappingException 
  40.      * @throws IOException 
  41.      */  
  42.     @Test  
  43.     public void testSearch() throws JsonParseException, JsonMappingException, IOException{  
  44.         GoodsFilter2ES filter = new GoodsFilter2ES();  
  45.         filter.setQueryStr("咖啡");  
  46.         filter.setRegionId("r2");  
  47.         List<Goods> result = ESUtils.search(filter);  
  48.         for (Goods goods : result) {  
  49.             System.out.println(goods);  
  50.         }  
  51.     }  
  52.       
  53.     /** 
  54.      * 測試新增doc 
  55.      * @throws UnknownHostException 
  56.      * @throws JsonProcessingException 
  57.      */  
  58.     @Test  
  59.     public void testAddDoc() throws UnknownHostException, JsonProcessingException{  
  60.         //test_index 和 goods 在建立索引的時候寫死了 因此這樣 就傳這兩個值  
  61.         String[] r = {"r2","r3"};  
  62.         Goods goods = new Goods(5L, "新增的咖啡", r);  
  63.         ESUtils.addDocument("test_index", "goods", goods);  
  64.     }  
  65.       
  66.     /** 
  67.      * 測試修改doc 
  68.      * @throws UnknownHostException 
  69.      * @throws JsonProcessingException 
  70.      */  
  71.     @Test  
  72.     public void testUpdateDoc() throws UnknownHostException, JsonProcessingException{  
  73.         String[] r = {"r2","r3"};  
  74.         Goods goods = new Goods(5L, "修改啦的咖啡", r);  
  75.         ESUtils.updateDocument("test_index", "goods", goods);  
  76.     }  
  77.       
  78.     /** 
  79.      * 測試刪除doc 
  80.      * @throws UnknownHostException 
  81.      * @throws JsonProcessingException 
  82.      */  
  83.     @Test  
  84.     public void testDelDoc() throws UnknownHostException, JsonProcessingException{  
  85.         ESUtils.deleteDocument("test_index", "goods", 5L);  
  86.     }  
  87. }  

好啦,簡單的入門就到這裏了。其他的各位去官網  https://www.elastic.co 學習更多的東西吧。
代碼很簡單,就不上傳工程了。
相關文章
相關標籤/搜索