基于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(){retu 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);retu 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 medicineMedicine对象 * @retu */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();}retu 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格式的数据集合 * * @retu */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 * @retu */public IndexResponse createIndexResponse(String indexname, String type,String jsondata){IndexResponse response = client.prepareIndex(indexname, type).setSource(jsondata).execute().actionGet();retu response;}/** * 执行搜索 * @param queryBuilder * @param indexname * @param type * @retu */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));}}retu 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(window下bin/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]
作者:苏二
来源链接:https://www.cnblogs.com/dennisit/archive/2013/04/08/3008631.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。