ElasticSearch學習一:搜索實例演示(Java API)

安裝包下載
當前最新版本爲:0.20.6
http://www.elasticsearch.org/download/

官方視頻教程
http://www.elasticsearch.org/videos/

Window環境
下載完解開有以下個包:

bin是運行的腳本,config是設置文件,lib是放依賴的包。


啓動解壓目錄下的bin名稱的文件夾,雙擊elasticsearch.bat文件,就可以啓動elasticsearch,啓動成功界面如下:

啓動成功後,會在解壓目錄下增加2個文件件,data用於數據存儲, logs用於日誌記錄,可以自己創建plugins目錄中用於放置自己的插件。

此時可以在瀏覽器中輸入http://localhost:9200/

"ok" : true, 
"status" : 200, 
"name" : "Glob Herman", 
"version" : { "number" : "0.20.6", "snapshot_build" : false }, "tagline" : "You Know, for Search" }

出現上面結果,表示成功啓動!

 

集成分詞器的ElasticSearch下載地址:

https://github.com/medcl/elasticsearch-rtf

 

Java模擬簡單搜索

實體類

package org.dennisit.entity;
/**
 * 
 *
 *  @version : 1.0
 *  
 *  @author  : 蘇若年              <a href="mailto:[email protected]">發送郵件</a>
 *    
 *  @since   : 1.0        創建時間:    2013-4-8    下午04:51:03
 *     
 *  @function: TODO        
 *
 */
public class Medicine {

    private Integer id;
    private String name;
    private String function;
    
    public Medicine() {
        super();
    }

    public Medicine(Integer id, String name, String function) {
        super();
        this.id = id;
        this.name = name;
        this.function = function;
    }
    
    //getter and  setter ()
}

模擬數據

package org.dennisit.entity;
import java.util.ArrayList;
import java.util.List;
import org.dennisit.util.JsonUtil;

/**
 * 
 *
 *  @version : 1.0
 *  
 *  @author  : 蘇若年              <a href="mailto:[email protected]">發送郵件</a>
 *    
 *  @since   : 1.0        創建時間:    2013-4-8    上午11:38:15
 *     
 *  @function: TODO        
 *
 */
public class DataFactory {
    
    public static DataFactory dataFactory = new DataFactory();
    
    private DataFactory(){
        
    }
    
    public DataFactory getInstance(){
        return dataFactory;
    }
    
    public static List<String> getInitJsonData(){
        List<String> list = new ArrayList<String>();
        String data1  = JsonUtil.obj2JsonData(new Medicine(1,"銀花 感冒 顆粒","功能主治:銀花感冒顆粒 ,頭痛,清熱,解表,利咽。"));
        String data2  = JsonUtil.obj2JsonData(new Medicine(2,"感冒  止咳糖漿","功能主治:感冒止咳糖漿,解表清熱,止咳化痰。"));
        String data3  = JsonUtil.obj2JsonData(new Medicine(3,"感冒靈顆粒","功能主治:解熱鎮痛。頭痛 ,清熱。"));
        String data4  = JsonUtil.obj2JsonData(new Medicine(4,"感冒  靈膠囊","功能主治:銀花感冒顆粒 ,頭痛,清熱,解表,利咽。"));
        String data5  = JsonUtil.obj2JsonData(new Medicine(5,"仁和 感冒 顆粒","功能主治:疏風清熱,宣肺止咳,解表清熱,止咳化痰。"));
        list.add(data1);
        list.add(data2);
        list.add(data3);
        list.add(data4);
        list.add(data5);
        return list;
    }
}

應用工具類


package org.dennisit.util;
import java.io.IOException;
import org.dennisit.entity.Medicine;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;

/**
 * 
 *
 *  @version : 1.0
 *  
 *  @author  : 蘇若年              <a href="mailto:[email protected]">發送郵件</a>
 *    
 *  @since   : 1.0        創建時間:    2013-4-8    上午11:34:56
 *     
 *  @function: TODO        
 *
 */
public class JsonUtil {

    /**
     * 實現將實體對象轉換成json對象
     * @param medicine    Medicine對象
     * @return
     */
    public static String obj2JsonData(Medicine medicine){
        String jsonData = null;
        try {
            //使用XContentBuilder創建json數據
            XContentBuilder jsonBuild = XContentFactory.jsonBuilder();
            jsonBuild.startObject()
            .field("id",medicine.getId())
            .field("name", medicine.getName())
            .field("funciton",medicine.getFunction())
            .endObject();
            jsonData = jsonBuild.string();
            System.out.println(jsonData);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonData;
    }

}

ElasticSearch核心搜索模擬類

package org.dennisit.elastic.process;

import java.util.ArrayList;
import java.util.List;
import org.dennisit.entity.DataFactory;
import org.dennisit.entity.Medicine;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
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;

/**
 * 
 *
 *  @version : 1.0
 *  
 *  @author  : 蘇若年              <a href="mailto:[email protected]">發送郵件</a>
 *    
 *  @since   : 1.0        創建時間:    2013-4-8    上午11:34:04
 *     
 *  @function: TODO        
 *
 */
public class ElasticSearchHandler {

    private Client client;

    public ElasticSearchHandler(){    
        //使用本機做爲節點
        this("127.0.0.1");
    }
    
    public ElasticSearchHandler(String ipAddress){
        //集羣連接超時設置
        /*  
              Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").build();
            client = new TransportClient(settings);
         */
        client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));
    }
    
    
    /**
     * 建立索引,索引建立好之後,會在elasticsearch-0.20.6\data\elasticsearch\nodes\0創建所以你看
     * @param indexName  爲索引庫名,一個es集羣中可以有多個索引庫。 名稱必須爲小寫
     * @param indexType  Type爲索引類型,是用來區分同索引庫下不同類型的數據的,一個索引庫下可以有多個索引類型。
     * @param jsondata     json格式的數據集合
     * 
     * @return
     */
    public void createIndexResponse(String indexname, String type, List<String> jsondata){
        //創建索引庫 需要注意的是.setRefresh(true)這裏一定要設置,否則第一次建立索引查找不到數據
        IndexRequestBuilder requestBuilder = client.prepareIndex(indexname, type).setRefresh(true);
        for(int i=0; i<jsondata.size(); i++){
            requestBuilder.setSource(jsondata.get(i)).execute().actionGet();
        }     
         
    }
    
    /**
     * 創建索引
     * @param client
     * @param jsondata
     * @return
     */
    public IndexResponse createIndexResponse(String indexname, String type,String jsondata){
        IndexResponse response = client.prepareIndex(indexname, type)
            .setSource(jsondata)
            .execute()
            .actionGet();
        return response;
    }
    
    /**
     * 執行搜索
     * @param queryBuilder
     * @param indexname
     * @param type
     * @return
     */
    public List<Medicine>  searcher(QueryBuilder queryBuilder, String indexname, String type){
        List<Medicine> list = new ArrayList<Medicine>();
        SearchResponse searchResponse = client.prepareSearch(indexname).setTypes(type)
        .setQuery(queryBuilder)
        .execute()
        .actionGet();
        SearchHits hits = searchResponse.hits();
        System.out.println("查詢到記錄數=" + hits.getTotalHits());
        SearchHit[] searchHists = hits.getHits();
        if(searchHists.length>0){
            for(SearchHit hit:searchHists){
                Integer id = (Integer)hit.getSource().get("id");
                String name =  (String) hit.getSource().get("name");
                String function =  (String) hit.getSource().get("funciton");
                list.add(new Medicine(id, name, function));
            }
        }
        return list;
    }
    
    
    public static void main(String[] args) {
        ElasticSearchHandler esHandler = new ElasticSearchHandler();
        List<String> jsondata = DataFactory.getInitJsonData();
        String indexname = "indexdemo";
        String type = "typedemo";
        esHandler.createIndexResponse(indexname, type, jsondata);
        //查詢條件
        QueryBuilder queryBuilder = QueryBuilders.fieldQuery("name", "感冒");
        /*QueryBuilder queryBuilder = QueryBuilders.boolQuery()
          .must(QueryBuilders.termQuery("id", 1));*/
        List<Medicine> result = esHandler.searcher(queryBuilder, indexname, type);
        for(int i=0; i<result.size(); i++){
            Medicine medicine = result.get(i);
            System.out.println("(" + medicine.getId() + ")藥品名稱:" +medicine.getName() + "\t\t" + medicine.getFunction());
        }
    }
}

啓動ElasticSearch(windowbin/elasticsearch.bat)



程序運行前,默認的nodes目錄下沒有內容,運行程序後會建立如下目錄

控制檯輸出信息

{"id":1,"name":"銀花 感冒 顆粒","funciton":"功能主治:銀花感冒顆粒 ,頭痛,清熱,解表,利咽。"}
{"id":2,"name":"感冒  止咳糖漿","funciton":"功能主治:感冒止咳糖漿,解表清熱,止咳化痰。"}
{"id":3,"name":"感冒靈顆粒","funciton":"功能主治:解熱鎮痛。頭痛 ,清熱。"}
{"id":4,"name":"感冒  靈膠囊","funciton":"功能主治:銀花感冒顆粒 ,頭痛,清熱,解表,利咽。"}
{"id":5,"name":"仁和 感冒 顆粒","funciton":"功能主治:疏風清熱,宣肺止咳,解表清熱,止咳化痰。"}
查詢到記錄數=5
(4)藥品名稱:感冒  靈膠囊        功能主治:銀花感冒顆粒 ,頭痛,清熱,解表,利咽。
(1)藥品名稱:銀花 感冒 顆粒        功能主治:銀花感冒顆粒 ,頭痛,清熱,解表,利咽。
(2)藥品名稱:感冒  止咳糖漿        功能主治:感冒止咳糖漿,解表清熱,止咳化痰。
(3)藥品名稱:感冒靈顆粒        功能主治:解熱鎮痛。頭痛 ,清熱。
(5)藥品名稱:仁和 感冒 顆粒        功能主治:疏風清熱,宣肺止咳,解表清熱,止咳化痰。

集羣管理工具Head查看信息

附錄:

ElasticSearch安裝插件elasticsearch-head插件


安裝完之後,lasticsearch-0.20.6\plugins\目錄下就多了head插件

直接打開目錄中的index.html文件即可進入管理工具


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