ElasticSearch1.7 java api

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: package cn.xdf.wlyy.solr.utils;import java.util.ArrayList;import java.util.HashMap;import java.util.

package cn.xdf.wlyy.solr.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.concurrent.ExecutionException;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.highlight.HighlightField;

import com.alibaba.fastjson.JSONObject;

import cn.xdf.wlyy.bbyh.vo.SearchParVo;
import cn.xdf.wlyy.utils.PagedResult;

/**
* Title. <br>
* ElasticSearch工具类.
* <p>
* Copyright: Copyright (c) 2017年7月7日 下午1:09:36
* <p>
* <p>
* Author: jinxudong@xdf.cn
* <p>
* Version: 1.0
* <p>
*/
/**
* Title. <br>
* ElasticSearch 工具类.
* <p>
* Copyright: Copyright (c) 2017年7月10日 上午9:05:30
* <p>
* 2016-3-21 Company: 北京新东方学校
* <p>
* Author: jinxudong@xdf.cn
* <p>
* Version: 1.0
* <p>
*/
public class EsUtil {

/** 启用日志 */
private static Logger logger = Logger.getLogger(EsUtil.class);

private static TransportClient client;

private static ResourceBundle resource = ResourceBundle.getBundle("es");

/** 索引库名称 */
private static String index = resource.getString("es.db");

/** 索引表名称 */
private static String type = resource.getString("es.table");

/** 集群分片数 */
private static String shards_str = resource.getString("es.shards");

private static Integer shards = Integer.parseInt(shards_str);

private static SearchRequestBuilder searchRequestBuilder;

// 获取集群名称
private static String clustername = resource.getString("es.cluster.name");

// 获取集群ip/域名
private static String hostname = resource.getString("es.hostname");

// 获取第一个节点端口号
private static String port1 = resource.getString("es.port.one");

// 获取第一个节点端口号
private static String port2 = resource.getString("es.port.two");

private static Settings settings;

 

//es加载一次 避免多次链接造成内存溢出 或者使用单例模式

static {
settings = ImmutableSettings.settingsBuilder()
// client.transport.sniff=true
// 客户端嗅探整个集群的状态,把集群中其它机器的ip地址自动添加到客户端中,并且自动发现新加入集群的机器
.put("client.transport.sniff", true).put("client", true)// 仅作为客户端连接
.put("data", false).put("cluster.name", clustername)// 集群名称
.build();
client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(hostname, Integer.parseInt(port1)))// TCP
// 连接地址
.addTransportAddress(new InetSocketTransportAddress(hostname, Integer.parseInt(port2)));
}

/**
* 创建索引 写入elasticsearch
*
* @param jsonlist
* 要创建索引的jsonlist数据
*/
public static void createIndex(List<JSONObject> jsonlist) {
try {
// 创建索引
for (int i = 0; i < jsonlist.size(); i++) {
IndexResponse indexResponse = client.prepareIndex(index, type, jsonlist.get(i).getString("id")).setSource(jsonlist.get(i).toString())
.execute().actionGet();
if (indexResponse.isCreated()) {
logger.info("写入索引库成功...");
} else {
logger.info("写入索引库失败...");
}
}
}
catch (Exception e) {
logger.error(e);
}

}

/**
* 根据索引id删除
*
* @param uids
* 索引id
*/
public static void deleteIndex(List<String> uids) {
for (int i = 0; i < uids.size(); i++) {
DeleteResponse dResponse = client.prepareDelete(index, type, uids.get(i)).execute().actionGet();
if (dResponse.isContextEmpty()) {
logger.info(uids.get(i) + "删除成功...");
} else {
logger.info(uids.get(i) + "删除失败...");
}
}
}

/**
* 根据索引名称删除
*
* @param indexName
* 索引库名称
*/
public static void deleteIndexLib(String indexName) {
DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(indexName).execute().actionGet();
if (dResponse.isContextEmpty()) {
logger.info(indexName + "删除成功。");
} else {
logger.info(indexName + "删除失败");
}
}

/**
* @param uid
* 要更新的索引id
* @param json
* 要更新的json数据
*/
public static void updateIndex(String uid, JSONObject json) {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(index);
updateRequest.type(type);
updateRequest.id(uid);
updateRequest.doc(json);
try {
UpdateResponse updateResponse = client.update(updateRequest).get();
if (!updateResponse.isCreated()) {
logger.info(uid + "更新成功");
} else {
logger.info(uid + "更新失败");
}
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
logger.error(e);
}
catch (ExecutionException e) {
// TODO Auto-generated catch block
logger.error(e);
}
}

/**
* 多字段查询
*
* @param pageSize
* 页面大小
* @param keyword
* 查询关键字
* @param columns
* 不确定多个索引字段
* @return map集合 map.put("dispage", disPage); map.put("jsonlist",
* resultlist);
*/
public static Map<String, Object> query(Integer pageSize, Integer currentNo, SearchParVo vo, String... columns) {

searchRequestBuilder = client.prepareSearch(index);
HashMap<String, Object> map = new HashMap<String, Object>();
// 搜索结果集
List<JSONObject> resultlist = new ArrayList<JSONObject>();
QueryBuilder qb = null;
QueryBuilder qb_state = null;
QueryBuilder qb_dept = null;
QueryBuilder qb_item = null;
QueryBuilder qb_subject = null;
QueryBuilder qb_regtype = null;
QueryBuilder qb_disway = null;
BoolQueryBuilder querybuilder = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(vo.getTitle())) {
qb = QueryBuilders.multiMatchQuery(vo.getTitle(), columns);
querybuilder.must(qb);
// 必要条件 查询需要显示的内容
qb_state = QueryBuilders.matchPhraseQuery("state", "1");
querybuilder.must(qb_state);
if (StringUtils.isNotBlank(vo.getDid())) {
qb_dept = QueryBuilders.matchPhraseQuery("d_id", vo.getDid());
querybuilder.must(qb_dept);
}
if (StringUtils.isNotBlank(vo.getIid())) {
qb_item = QueryBuilders.matchPhraseQuery("i_id", vo.getIid());
querybuilder.must(qb_item);
}
if (StringUtils.isNotBlank(vo.getSid())) {
qb_subject = QueryBuilders.matchPhraseQuery("s_id", vo.getSid());
querybuilder.must(qb_subject);
}
if (StringUtils.isNotBlank(vo.getRegtype())) {
qb_regtype = QueryBuilders.matchPhraseQuery("registration_type", vo.getRegtype());
querybuilder.must(qb_regtype);
}
if (StringUtils.isNotBlank(vo.getDisway())) {
qb_disway = QueryBuilders.matchPhraseQuery("discount_way", vo.getDisway());
querybuilder.must(qb_disway);
}
} else {
qb = QueryBuilders.matchAllQuery();
querybuilder.must(qb);
}
searchRequestBuilder.setQuery(querybuilder);
SearchResponse response = searchRequestBuilder.execute().actionGet();
SearchHits hits = response.getHits();
// 记录总数
long total = hits.totalHits();
// 计算总页数
int totalPages = totalPage(1, pageSize, (int) total);
// 每次开始的位置
int start = (currentNo - 1) * pageSize;
// 添加高亮字段
searchRequestBuilder.addHighlightedField("title");
searchRequestBuilder.setHighlighterPreTags("<span style=\"color:red\">");
searchRequestBuilder.setHighlighterPostTags("</span>");
response = searchRequestBuilder.setFrom(start).setSize(pageSize).execute().actionGet();
SearchHit[] searchHits = response.getHits().hits();
// 封装分页对象信息
PagedResult disPage = new PagedResult();
disPage.setTotal(total);
disPage.setPages(totalPages);
disPage.setPageNo(currentNo);
disPage.setPageSize(pageSize);
for (SearchHit searchHit : searchHits) {
Map<String, Object> dd = searchHit.getSource();
JSONObject json = (JSONObject) JSONObject.toJSON(dd);
// 从设定的高亮域中取得指定域
Map<String, HighlightField> result = searchHit.highlightFields();
HighlightField titleField = result.get("title");
if (titleField != null) {
// 取得定义的高亮标签
Text[] titleTexts = titleField.fragments();
// 为title串值增加自定义的高亮标签
String title = "";
for (Text text : titleTexts) {
title += text;
}
json.put("title", title);
}
resultlist.add(json);
}
map.put("dispage", disPage);
map.put("jsonlist", resultlist);
return map;
}

/**
* @param currentNo
* 当前页
* @param pageSize
* 一页显示多少条记录
* @param totalNum
* 总记录
* @return
*/
public static int totalPage(Integer currentNo, Integer pageSize, int totalNum) {
int totalPages = 0;
if (totalNum % pageSize == 0) {
totalPages = totalNum / pageSize;
} else {
totalPages = totalNum / pageSize + 1;
}
return totalPages;
}
}

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
9天前
|
Java API Spring
打造未来电商新引擎:揭秘Java可扩展API设计,让支付与物流灵活如丝,引领电商时代潮流!
【8月更文挑战第30天】本文通过电商平台案例,探讨了如何设计可扩展的Java API。首先定义支付和物流服务的接口与抽象类,然后实现具体服务,接着引入工厂模式或依赖注入管理服务实例,最后通过配置实现灵活扩展。这种设计确保了应用架构的灵活性和长期稳定性。
25 3
|
10天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
32 0
|
18天前
|
Java 编译器 API
Java新手必看:轻松掌握API文档使用技巧!
API是预定义的接口,允许开发人员使用一组例程及协议而无需了解内部实现细节。Java API文档详述了标准类库,支持平台无关性和安全性,确保Java程序跨平台的一致性行为。Java类可通过单文件或多文件定义,并支持内部类及包组织。常用API如`Scanner`用于输入处理,`Random`生成随机数,`ArrayList`提供动态列表管理,而`Arrays`和`Math`分别简化数组操作和数学计算。掌握这些API能显著提升Java开发效率。
|
22小时前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
18 10
|
2天前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
21 11
|
22小时前
|
Java API 数据处理
【Java的SIMD革命】JDK 22向量API:释放硬件潜能,让Java应用性能飙升!
【9月更文挑战第7天】 JDK 22向量API的发布标志着Java编程语言在SIMD技术领域的重大突破。这一新特性不仅释放了现代硬件的潜能,更让Java应用性能实现了飙升。我们有理由相信,在未来的发展中,Java将继续引领编程语言的潮流,为开发者们带来更加高效、更加强大的编程体验。让我们共同期待Java在SIMD技术的推动下开启一个全新的性能提升时代!
|
2天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
8天前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
15天前
|
安全 Java API
|
17天前
|
SQL Java 关系型数据库
理解 Java 持久化 API(JPA)
【8月更文挑战第21天】
12 1
下一篇
DDNS