es版本 6.*
有两种Client
transportClient和restClient
获取工具类方法:
public class ESClient {
public static TransportClient getTransportClient() {
// 解决netty冲突
// System.setProperty("es.set.netty.runtime.available.processors", "false");
try {
//设置集群名称
// Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
Settings settings = Settings.builder().put("cluster.name", "realfake-es").build();
//创建client
return new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName(Constants.ES_HOSTS), 9300));
// .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
}
}
public static RestHighLevelClient getRestHighLevelClient() {
// 解决netty冲突
// System.setProperty("es.set.netty.runtime.available.processors", "false");
return new RestHighLevelClient(
RestClient.builder(
new HttpHost(Constants.ES_HOSTS, 9200, "http")
));
}
}
以下是工具类,省略getter和setter,属性是用来过滤和排序用的,使用Scroll检索后pageNum属性无效
public class ESRestUtil {
private int pageSize;
private int pageNum;
private String sort;
private boolean desc;
private String brandId;
private String seriesId;
private String typeId;
private String uniteId;
private int price;
private long dateStart;
private long dateEnd;
/**
* 删除文档
*/
public DeleteResponse deleteById(String index, String type, String documentId) {
TransportClient client = ESClient.getTransportClient();
if (client == null) {
return null;
}
DeleteRequestBuilder delete = client.prepareDelete(index, type, documentId);
DeleteResponse response = delete.execute().actionGet();
client.close();
return response;
}
/**
* 查询,通过scroll方式,第一次查询返回数据和id
* 之后查询检测到id不为空则使用scroll快照的方式返回数据,和更新位置后的id
*/
public SearchResponse getAllByScroll(String index, String type, String scrollId) {
TransportClient client = ESClient.getTransportClient();
if (client == null) {
return null;
}
// 设置过滤器
// 获取bool查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 添加 filter 过滤
if (brandId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("brandId", brandId));
}
if (seriesId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("seriesId", seriesId));
}
if (typeId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("typeId", typeId));
}
if (uniteId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("uniteId", uniteId));
}
if (price != 0) {
// 小于等于 price
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(price));
}
if (dateStart != 0) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte(dateStart));
}
if (dateEnd != 0) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").lte(dateEnd));
}
// 如果是继续浏览,则传入scrollId,获取搜索结果,和最新位置的id
if (scrollId != null) {
SearchScrollRequestBuilder ssrb = client.prepareSearchScroll(scrollId);
// 重新设定id存在时间
ssrb.setScroll("2m");
SearchResponse response = ssrb.execute().actionGet();
client.close();
return response;
} else {
// 如果是第一次搜索,则返回搜索结果和浏览位置id
// 获取客户端 创建搜索
// 设置scroll过期时间,2分钟\添加过滤器
SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).setScroll("2m").setPostFilter(boolQueryBuilder);
// 获取match all查询
SearchRequestBuilder searchRequestBuilder = srb.setQuery(QueryBuilders.matchAllQuery());
// 配置每次返回数据量
if (pageSize == 0) {
searchRequestBuilder.setSize(10);
}
// 排序方式使用date降序
searchRequestBuilder.addSort("date", SortOrder.DESC);
// 执行搜索,
// 返回搜索response,包含数据、搜索结果数、scrollId等
SearchResponse response = searchRequestBuilder.execute().actionGet();
client.close();
return response;
}
}
public SearchResponse searchMutilByScroll(String index, String type, String keyWord, String scrollId) {
TransportClient client = ESClient.getTransportClient();
if (client == null) {
return null;
}
// 设置过滤器
// 获取bool查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 添加 filter 过滤
if (brandId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("brandId", brandId));
}
if (seriesId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("seriesId", seriesId));
}
if (typeId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("typeId", typeId));
}
if (uniteId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("uniteId", uniteId));
}
if (price != 0) {
// 小于等于 price
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(price));
}
if (dateStart != 0) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte(dateStart));
}
if (dateEnd != 0) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").lte(dateEnd));
}
// 如果是继续浏览,则传入scrollId,获取搜索结果,和最新位置的id
if (scrollId != null) {
SearchScrollRequestBuilder ssrb = client.prepareSearchScroll(scrollId);
// 重新设定id存在时间
ssrb.setScroll("2m");
SearchResponse response = ssrb.execute().actionGet();
client.close();
return response;
} else {
// 如果是第一次搜索,则返回搜索结果和浏览位置id
// 获取客户端 创建搜索
// 设置scroll过期时间,2分钟\添加过滤器
SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).setScroll("2m").setPostFilter(boolQueryBuilder);
// 添加搜索关键字条件,目前匹配 标题和描述任一包含就行,使用should
QueryBuilder titleQueryBuilder = QueryBuilders.matchPhraseQuery("title", keyWord);
QueryBuilder describeQueryBuilder = QueryBuilders.matchPhraseQuery("describe", keyWord);
SearchRequestBuilder searchRequestBuilder = srb.setQuery(
boolQueryBuilder
.must(describeQueryBuilder)
.should(titleQueryBuilder)
);
// 配置每次返回数据量
if (pageSize == 0) {
searchRequestBuilder.setSize(10);
}
// 排序方式,未指定则用score相关度排序
if (sort != null) {
searchRequestBuilder.addSort(sort, desc ? SortOrder.DESC : SortOrder.ASC);
} else {
searchRequestBuilder.setExplain(true);
}
// 执行搜索,
// 返回搜索response,包含数据、搜索结果数、scrollId等
SearchResponse response = searchRequestBuilder.execute().actionGet();
client.close();
return response;
}
}
/**
* 查询
*
* @throws Exception
*/
public SearchResponse searchMutil(String index, String type, String keyWord) {
TransportClient client = ESClient.getTransportClient();
if (client == null) {
return null;
}
// 获取客户端 创建搜索
SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type);
// 获取bool查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 添加 filter 过滤
if (brandId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("brandId", brandId));
}
if (seriesId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("seriesId", seriesId));
}
if (typeId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("typeId", typeId));
}
if (uniteId != null) {
boolQueryBuilder.filter(QueryBuilders.termQuery("uniteId", uniteId));
}
if (price != 0) {
// 小于等于 price
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(price));
}
if (dateStart != 0) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte(dateStart));
}
if (dateEnd != 0) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").lte(dateEnd));
}
// 添加搜索关键字条件,目前匹配 标题和描述任一包含就行,使用should
QueryBuilder titleQueryBuilder = QueryBuilders.matchPhraseQuery("title", keyWord);
QueryBuilder describeQueryBuilder = QueryBuilders.matchPhraseQuery("describe", keyWord);
SearchRequestBuilder searchRequestBuilder = srb.setQuery(
boolQueryBuilder
.must(describeQueryBuilder)
.should(titleQueryBuilder)
);
// 配置分页
searchRequestBuilder.setFrom(pageNum);
if (pageSize != 0) {
searchRequestBuilder.setSize(pageSize);
}
// 排序方式,未指定则用score相关度排序
if (sort != null) {
searchRequestBuilder.addSort(sort, desc ? SortOrder.DESC : SortOrder.ASC);
} else {
searchRequestBuilder.setExplain(true);
}
// 执行搜索,
// 返回搜索response,包含数据、搜索结果数等
SearchResponse response = searchRequestBuilder.execute().actionGet();
client.close();
return response;
}
/**
* 验证索引是否存在
*
* @param index 索引名称
* @return
* @throws Exception
*/
public boolean indexExists(String index) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
GetIndexRequest request = new GetIndexRequest();
request.indices(index);
request.local(false);
request.humanReadable(true);
boolean exists = client.indices().exists(request);
client.close();
return exists;
}
/**
* 创建索引
*
* @param index
* @param indexType
* @param properties 结构: {name:{type:text}} {age:{type:integer}}
* @return
* @throws Exception
*/
public boolean indexCreate(String index, String indexType,
Map<String, Object> properties) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
if (indexExists(index)) {
client.close();
return true;
}
CreateIndexRequest request = new CreateIndexRequest(index);
request.settings(Settings.builder().put("index.number_of_shards", 3)
.put("index.number_of_replicas", 2));
Map<String, Object> jsonMap = new HashMap<>();
Map<String, Object> mapping = new HashMap<>();
mapping.put("properties", properties);
jsonMap.put(indexType, mapping);
request.mapping(indexType, jsonMap);
CreateIndexResponse createIndexResponse = client.indices().create(
request);
boolean acknowledged = createIndexResponse.isAcknowledged();
client.close();
return acknowledged;
}
/**
* 删除索引
*
* @param index
* @return
* @throws Exception
*/
public boolean indexDelete(String index) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
try {
DeleteIndexRequest request = new DeleteIndexRequest(index);
DeleteIndexResponse deleteIndexResponse = client.indices().delete(
request);
return deleteIndexResponse.isAcknowledged();
} catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.NOT_FOUND) {
return true;
} else {
return false;
}
} finally {
client.close();
}
}
/**
* 根据文档ID,传入json结构,创建或更新文档,
*
* @param index
* @param indexType
* @param documentId
* @param jsonStr
* @return
* @throws Exception
*/
public boolean documentCreate(String index, String indexType,
String documentId, String jsonStr) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
IndexRequest request = new IndexRequest(index, indexType, documentId);
request.source(jsonStr, XContentType.JSON);
IndexResponse indexResponse = client.index(request);
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
|| indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
client.close();
return true;
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
client.close();
return true;
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
.getFailures()) {
client.close();
throw new Exception(failure.reason());
}
}
client.close();
return false;
}
/**
* 传入Map,ID,创建或更新文档
*
* @param index
* @param indexType
* @param documentId
* @param map
* @return
* @throws Exception
*/
public boolean documentCreate(String index, String indexType,
String documentId, Map<String, Object> map) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
IndexRequest request = new IndexRequest(index, indexType, documentId);
request.source(map);
IndexResponse indexResponse = client.index(request);
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
|| indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
client.close();
return true;
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
client.close();
return true;
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
.getFailures()) {
client.close();
throw new Exception(failure.reason());
}
}
client.close();
return false;
}
/**
* 传入json结构数据,创建文档,返回ID
*
* @param index
* @param indexType
* @param jsonStr
* @return
* @throws Exception
*/
public String documentCreate(String index, String indexType, String jsonStr)
throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
IndexRequest request = new IndexRequest(index, indexType);
request.source(jsonStr, XContentType.JSON);
IndexResponse indexResponse = client.index(request);
String id = indexResponse.getId();
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
|| indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
client.close();
return id;
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
client.close();
return id;
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
.getFailures()) {
client.close();
throw new Exception(failure.reason());
}
}
client.close();
return null;
}
/**
* 传入Map,创建文档,返回ID
*
* @param index
* @param indexType
* @param map
* @return
* @throws Exception
*/
public String documentCreate(String index, String indexType,
Map<String, Object> map) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
IndexRequest request = new IndexRequest(index, indexType);
request.source(map);
IndexResponse indexResponse = client.index(request);
String id = indexResponse.getId();
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
|| indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
client.close();
return id;
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
client.close();
return id;
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
.getFailures()) {
client.close();
throw new Exception(failure.reason());
}
}
client.close();
return null;
}
public boolean documentDelete(String index, String indexType,
String documentId) throws Exception {
RestHighLevelClient client = ESClient.getRestHighLevelClient();
DeleteRequest request = new DeleteRequest(index, indexType, documentId);
DeleteResponse deleteResponse = client.delete(request);
if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) {
client.close();
return true;
}
ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
client.close();
return true;
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
.getFailures()) {
client.close();
throw new Exception(failure.reason());
}
}
client.close();
return false;
}
/**
* 将查询后获得的response转成list
*
* @param response
* @return
*/
public static List responseToList(SearchResponse response) {
SearchHits hits = response.getHits();
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < hits.getHits().length; i++) {
Map<String, Object> map = hits.getAt(i).getSourceAsMap();
list.add(map);
}
return list;
}
@Override
public String toString() {
return "ESRestUtil{" +
"pageSize=" + pageSize +
", pageNum=" + pageNum +
", sort='" + sort + '\'' +
", desc=" + desc +
", brandId='" + brandId + '\'' +
", seriesId='" + seriesId + '\'' +
", typeId='" + typeId + '\'' +
", uniteId='" + uniteId + '\'' +
", price=" + price +
'}';
}
}
个人测试时的方法,无逻辑只看使用方式:
package com.realfake.model.utils.elasticsearch;
import org.elasticsearch.action.search.SearchResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) throws Exception {
ESRestUtil util = new ESRestUtil();
System.out.println(util.deleteById("commodity", "commodity", "1"));
System.out.println(util.indexExists("commodity"));
System.out.println(util.indexExists("indextest005"));
Map<String, Object> map = new HashMap<>();
map.put("name", new HashMap() {
{
put("type", "text");
}
});
map.put("age", new HashMap() {
{
put("type", "double");
}
});
map.put("sex", new HashMap() {
{
put("type", "double");
}
});
map.put("address", new HashMap() {
{
put("type", "text");
}
});
// 创建主题
util.indexCreate("indextest005", "sx", map);
//创建文档1
System.out.println(util.documentCreate("indextest005", "sx",
new HashMap<String,Object>() {
{
put("name", "名称1");
put("age", 18);
put("sex", 10);
put("address", "地址1");
}
}));
// 创建更新文档2
System.out.println(util.documentCreate("commodity", "commodity", "1",
new HashMap<String,Object>() {
{
put("typeId", new String[]{"1","2"});
put("price", new int[]{1,2});
put("age", 18);
put("sex", 10);
put("address", "123");
}
}));
//删除文档
System.out.println(util.documentDelete("indextest005", "sx", "EvyzG2oBWpJzBJGJTpdY"));
// 多条件
util.setSort("price");
System.out.println(ESRestUtil.responseToList(util.searchMutil("commodity", "commodity","阿迪")));
// scroll检索
SearchResponse response = util.searchMutilByScroll("commodity", "commodity","商品",null);
while(true){
System.out.println(ESRestUtil.responseToList(response));
System.out.println(response.getScrollId());
response = util.searchMutilByScroll("commodity", "commodity","商品",response.getScrollId());
}
}
}