基於Luence的分布式搜索引擎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:DennisIT@163.com">發送郵件</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:DennisIT@163.com">發送郵件</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:DennisIT@163.com">發送郵件</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:DennisIT@163.com">發送郵件</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文件即可進入管理工具
 

在此感謝好友李志,林帆,天天天藍 學習時給予指導.
轉載請注明出處:[http://www.cnblogs.com/dennisit/archive/2013/04/08/3008631.html]

 

在線交談

 


免責聲明!

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



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