设为首页 收藏本站
查看: 1590|回复: 0

[经验分享] 使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示

[复制链接]

尚未签到

发表于 2017-5-21 10:11:38 | 显示全部楼层 |阅读模式
安装包下载
当前最新版本为:0.20.6
http://www.elasticsearch.org/download/ 

官方视频教程
http://www.elasticsearch.org/videos/

Window环境
下载完解开有以下个包:
bin是运行的脚本,config是设置文件,lib是放依赖的包。
DSC0000.png

启动解压目录下的bin名称的文件夹,双击elasticsearch.bat文件,就可以启动elasticsearch,启动成功界面如下: DSC0001.png
启动成功后,会在解压目录下增加2个文件件,data用于数据存储, logs用于日志记录,可以自己创建plugins目录中用于放置自己的插件。
DSC0002.png
此时可以在浏览器中输入: 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模拟简单搜索
实体类

DSC0003.gif

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)

DSC0004.png


程序运行前,默认的nodes目录下没有内容,运行程序后会建立如下目录

DSC0005.png
DSC0006.png
控制台输出信息



{"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查看信息
DSC0007.png
附录:
ElasticSearch安装插件elasticsearch-head插件
DSC0008.png
安装完之后,lasticsearch-0.20.6\plugins\目录下就多了head插件
DSC0009.png
直接打开目录中的index.html文件即可进入管理工具
 
在此感谢好友李志,林帆,天天天蓝 学习时给予指导.
转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/04/08/3008631.html]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379520-1-1.html 上篇帖子: 7.分布式搜索elasticsearch java API ------与MongoDB同步数据 下篇帖子: Elasticsearch升级到1.2(1.x)API的变化-二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表