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;
}
以上代码搜索疾病信息中的名字与简介,同时搜索了disease和doctor两个索引
设置分页查询
.setFrom(from).setSize(size).setExplain(true))
3高亮信息
设置高亮显示信息首尾包裹的标签
    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使用(一)的更多相关文章

  1. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  2. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  3. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  4. Jest — ElasticSearch Java 客户端

    1. 介绍 任何使用过Elasticsearch的人都知道,使用基于rest的搜索API构建查询可能是单调乏味且容易出错的. 在本教程中,我们将研究Jest,一个用于Elasticsearch的HTT ...

  5. hadoop系列二:HDFS文件系统的命令及JAVA客户端API

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  6. 读《分布式一致性原理》JAVA客户端API操作2

    创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...

  7. elasticsearch java 客户端之action简介

    上一篇介绍了elasticsearch的client结构,client只是一个门面,在每个方法后面都有一个action来承接相应的功能.但是action也并非是真正的功能实现者,它只是一个代理,它的真 ...

  8. ElasticSearch java客户端更新时出现的错误:NoNodeAvailableException[None of the configured nodes are available

    下午尝试 用ElasticSearch  的java客户端去做数据检索工作,测试了一下批量更新,代码如下: public static void bulkUpdateGoods(List<Goo ...

  9. [转载] ZooKeeper的Java客户端API

    转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...

随机推荐

  1. POJ 2253 Frogger【最短路变形/最小生成树的最大权/最小瓶颈树/A到B多条路径中的最小的最长边】

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...

  2. npm 安装或更新模块失败的解决办法

    头一次关注npm,在刚刚安装的机子上使用更新指令却报错,我还以为是SHA512有什么问题,后来发现是因为一些网络原因,所以,如果出现错误,务必修改默认配置为国内镜像,但是在publish之前,记得要改 ...

  3. 关于std::ios::sync_with_stdio(false)

    std::ios::sync_with_stdio(false); 很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题 ...

  4. 关于 Unity WebGL 的探索(二)

    关于 Unity WebGL 的探索(二) 上一篇博客记录了关于 WebGL 移植的第一步:部分 C/C++ 插件的编译,目前项目中的部分插件使用该方法通过,接下来比较大的一部分工作量是网络模块 We ...

  5. 线段树+哈希【CF580E】Kefa and Watch

    线段树+哈希[CF580E]Kefa and Watch Description \(n\)个数的字符串,\(m + k\)个操作 1 l r k把\(l - r\)赋值为\(k\) 2 l r d询 ...

  6. 36、Flask实战第36天:客户端权限验证

    编辑cms_base.html <li><a href="#">{{ g.cms_user.username }}<span>[超级管理员]&l ...

  7. python datetime处理时间(转)

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块,它提供 的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接 ...

  8. Compass用法

    一.什么是Compass? Compass是Sass的工具库,Compass在SASS的基础上,封装了一系列有用的模块去补充Sass的功能,类似Javascript和jQuery 二.安装 之前已经写 ...

  9. hdu 5755(Gauss 消元) &poj 2947

    Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  10. 【拓扑排序】Genealogical tree

    [POJ2367]Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5696   Accep ...