elasticsearch java客户端api使用(一)
1.客户端client构建
package com.pz998.app.service.utils;
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
import java.net.InetSocketAddress;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
public class SearchHelp {
private static TransportClient client = null;
public static Client getSearchClient() {
if(client!=null){
return client;
}
Settings setting = settingsBuilder()
//集群名称
.put("cluster.name", "es-cluster")
.put("client.transport.sniff", true)
.put("client.transport.ignore_cluster_name", false)
.put("client.transport.ping_timeout", "5s")
.put("client.transport.nodes_sampler_interval", "5s")
.build();
client = TransportClient.builder().settings(setting).build();
((TransportClient) client).addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("10.3.32.83", 9300)));
return client;
}
}
2.多字段检索
public SearchResultVo queryDiseaseOrDoctor(SearchParam searchParam,Client client){
Integer from = searchParam.getFrom()==null?0:searchParam.getFrom();
Integer size = searchParam.getPageSize()==null?0:searchParam.getPageSize();
MultiSearchResponse response = client.prepareMultiSearch()
//搜索疾病索引
.add(client.prepareSearch(DISEASE_INDEX)// 检索的目录
.setSearchType(SearchType.DEFAULT)// Query type
.setQuery(QueryBuilders.disMaxQuery()
.add(QueryBuilders.matchQuery("name", searchParam.getKeyword()))
.add(QueryBuilders.matchQuery("intro", searchParam.getKeyword())
))
.addHighlightedField("name")
.addHighlightedField("intro")
.setHighlighterPreTags(FIELD_HIGHLIGHT_PRE_TAG)
.setHighlighterPostTags(FIELD_HIGHLIGHT_POST_TAG)
.setFrom(from).setSize(size).setExplain(true))
//搜索医生索引
.add(client.prepareSearch(DOCTOR_INDEX)// 检索的目录
.setSearchType(SearchType.DEFAULT)// Query type
.setQuery(QueryBuilders.disMaxQuery()
.add(QueryBuilders.matchQuery("name", searchParam.getKeyword()))
.add(QueryBuilders.matchQuery("disease_tag", searchParam.getKeyword()))
//城市
// .add(QueryBuilders.matchQuery("city", searchParam.getCity()))
)
.addHighlightedField("name")
.addHighlightedField("disease_tag")
.setHighlighterPreTags(FIELD_HIGHLIGHT_PRE_TAG)
.setHighlighterPostTags(FIELD_HIGHLIGHT_POST_TAG)
.setFrom(from).setSize(size).setExplain(true))
.execute().actionGet();// 执行
SearchResultVo searchResultVo = new SearchResultVo();
List<BdDiseaseRpc> diseaseList = new ArrayList<BdDiseaseRpc>();
List<BdDoctorRpc> doctorList = new ArrayList<BdDoctorRpc>();
if(response.getResponses() != null) {
MultiSearchResponse.Item diseaseItem = response.getResponses().length>0?(response.getResponses())[0]:null;
MultiSearchResponse.Item doctorItem = response.getResponses().length>1?(response.getResponses())[1]:null;
if(diseaseItem!=null){
SearchResponse diseasResp = diseaseItem.getResponse();
System.out.println("命中疾病条数: " + diseasResp.getHits().getTotalHits());
searchResultVo.setDiseaseTotal(diseasResp.getHits().getTotalHits());
for (SearchHit hits : diseasResp.getHits().getHits()) {
Map<String, Object> sourceAsMap = hits.sourceAsMap();
//获取对应的高亮域
Map<String, HighlightField> result = hits.highlightFields();
//从设定的高亮域中取得指定域
HighlightField highlightFieldText = result.get("name");
String code = (String)sourceAsMap.get("code");
HighlightField introField = result.get("intro");
String name = getHighlightFieldText(highlightFieldText);
name = StringUtils.isEmpty(name)?(String)sourceAsMap.get("name"):name;
String intro = getHighlightFieldText(introField);
intro = StringUtils.isEmpty(intro)?(String)sourceAsMap.get("intro"):intro;
BdDiseaseRpc bdDiseaseRpc = new BdDiseaseRpc();
bdDiseaseRpc.setName(name);
bdDiseaseRpc.setCode(code);
bdDiseaseRpc.setIntro(intro);
diseaseList.add(bdDiseaseRpc);
}
searchResultVo.setDiseaseList(diseaseList);
}
if(doctorItem!=null){
SearchResponse doctorResp = doctorItem.getResponse();
System.out.println("命中医生条数: " + doctorResp.getHits().getTotalHits());
searchResultVo.setDoctorTotal(doctorResp.getHits().getTotalHits());
for (SearchHit hits : doctorResp.getHits().getHits()) {
Map<String, Object> sourceAsMap = hits.sourceAsMap();
//获取对应的高亮域
Map<String, HighlightField> result = hits.highlightFields();
//从设定的高亮域中取得指定域
HighlightField highlightFieldText = result.get("name");
String code = (String)sourceAsMap.get("code");
HighlightField diseaseTagField = result.get("disease_tag");
String name = getHighlightFieldText(highlightFieldText);
name = StringUtils.isEmpty(name)?(String)sourceAsMap.get("name"):name;
String diseaseTag = getHighlightFieldText(diseaseTagField);
diseaseTag = StringUtils.isEmpty(diseaseTag)?(String)sourceAsMap.get("disease_tag"):diseaseTag;
BdDoctorRpc bdDoctorRpc = new BdDoctorRpc();
bdDoctorRpc.setName(name);
bdDoctorRpc.setCode(code);
bdDoctorRpc.setDiseaseTag(diseaseTag);
doctorList.add(bdDoctorRpc);
}
searchResultVo.setDoctorList(doctorList);
}
}
return searchResultVo;
}
.setFrom(from).setSize(size).setExplain(true))
public static final String FIELD_HIGHLIGHT_PRE_TAG = "<span style=\"color:red\">";
public static final String FIELD_HIGHLIGHT_POST_TAG = "</span>";
.setHighlighterPreTags(FIELD_HIGHLIGHT_PRE_TAG)
.setHighlighterPostTags(FIELD_HIGHLIGHT_POST_TAG)
~
//从设定的高亮域中取得指定域
HighlightField highlightFieldText = result.get("name");
String code = (String)sourceAsMap.get("code");
HighlightField introField = result.get("intro");
String highlight = getHighlightFieldText(highlightFieldText);
String intro = getHighlightFieldText(introField);
elasticsearch java客户端api使用(一)的更多相关文章
- JAVA客户端API调用memcached两种方式
1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...
- zookeeper的Java客户端API
zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...
- Zookeeper的java客户端API使用方法(五)
前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...
- Jest — ElasticSearch Java 客户端
1. 介绍 任何使用过Elasticsearch的人都知道,使用基于rest的搜索API构建查询可能是单调乏味且容易出错的. 在本教程中,我们将研究Jest,一个用于Elasticsearch的HTT ...
- hadoop系列二:HDFS文件系统的命令及JAVA客户端API
转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...
- 读《分布式一致性原理》JAVA客户端API操作2
创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...
- elasticsearch java 客户端之action简介
上一篇介绍了elasticsearch的client结构,client只是一个门面,在每个方法后面都有一个action来承接相应的功能.但是action也并非是真正的功能实现者,它只是一个代理,它的真 ...
- ElasticSearch java客户端更新时出现的错误:NoNodeAvailableException[None of the configured nodes are available
下午尝试 用ElasticSearch 的java客户端去做数据检索工作,测试了一下批量更新,代码如下: public static void bulkUpdateGoods(List<Goo ...
- [转载] ZooKeeper的Java客户端API
转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...
随机推荐
- lr_Analysis Options选项介绍
- nginx中使用perl模块
转载自:http://www.netingcn.com/nginx-perl.html 如果对于一个绝大部分内容是静态的网站,只有极少数的地方需要动态显示,碰巧你又了解一点perl知识,那么nginx ...
- 【C#】构建可枚举类型(IEnumerable和IEnumerator)
为了开始对实现既有接口的了解,我们就看一下IEnumerable和IEnumerator的作用,想一下,C#支持关键字foreach,允许我们遍历任何数组类型的内容: //遍历数组的项 ,,} for ...
- vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸
转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...
- 如何用jmeter对websockt和protobuf进行压力测试
参考代码:https://github.com/hutao722/kekexinxin 这是基于Jmeter WebsocketSampler的插件,支持对基于websocket和protobuf的服 ...
- hdu 2196(Computer 树形dp)
A school bought the first computer some time ago(so this computer's id is 1). During the recent year ...
- 最近升级mysql5.7出现下面问题,ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by
执行sql: SELECT * FROM `user_link` WHERE `group_id` IN ('78', '79') GROUP BY `link_id` 报错: SQLSTATE[42 ...
- 【数论】【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational
看这个题解吧:http://blog.csdn.net/wubaizhe/article/details/77338332 代码里顺便把几个常用的线性筛附上了. Key:1.gcd(i,j)==1利用 ...
- 【dijkstra】【次短路】【fread】hdu6181 Two Paths
题意:给你一张简单无向图,问你1到n的次短路.注意,可以不是简单路径. 存个次短路板子,原理还是挺简单,直接看代码吧.然后这份代码还是个fread的示例用法. #include<cstdio&g ...
- 【找规律】【DFS】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem A. Arithmetic Derivative
假设一个数有n个质因子a1,a2,..,an,那么n'=Σ(a1*a2*...*an)/ai. 打个表出来,发现一个数x,如果x'=Kx,那么x一定由K个“基础因子”组成. 这些基础因子是2^2,3^ ...