当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

我来了!

拥有积分:3904
尚学堂雄起!!威武。。。

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

基于Luence的分布式搜索引擎ElasticSearch搜索实例演示(Java API)

我来了! 发表于 2年前 (2014-09-22 10:16:45)  |  评论(0)  |  阅读次数(580)| 0 人收藏此文章,   我要收藏   
安装包下载

当前最新版本为: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文件即可进入管理工具
分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183