elasticsearch工具
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.MultiSearchRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.get.GetResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
@Slf4j
@Component
public class ElasticsearchUtil {
@Autowired
private RestHighLevelClient esClient;
/**
* 创建索引时,分配的主分片的数量
*/
private static final String INDEX_NUM_OF_SHARDS = "index.number_of_shards";
/**
* 创建索引时,为每一个主分片分配的副本分片的数量
*/
private static final String INDEX_NUM_OF_REPLICAS = "index.number_of_replicas";
/**
* 索引是否存在
*
* @param indexName 索引名称
* @return
* @throws IOException
*/
public boolean existIndex(String indexName) throws IOException {
GetIndexRequest request = new GetIndexRequest(indexName);
return esClient.indices().exists(request, RequestOptions.DEFAULT);
}
/**
* 新增文档-json方式 同步
*
* @param indexName 索引名称
* @param id 文档id
* @throws IOException
*/
public IndexResponse addDocumentJSON(String indexName, String id, String json) throws IOException {
IndexRequest request = new IndexRequest(indexName).id(id).source(json, XContentType.JSON);
return esClient.index(request, RequestOptions.DEFAULT);
}
/**
* 新增文档-json方式 异步
*
* @param indexName 索引名称
* @param id 文档id
* @throws IOException
*/
public void addDocumentJSONAsync(String indexName, String id, String json) {
IndexRequest request = new IndexRequest(indexName);
request.id(id);
request.source(json, XContentType.JSON);
request.routing("routing");
esClient.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
log.debug("执行情况: " + indexResponse);
}
@Override
public void onFailure(Exception e) {
log.error("执行失败的原因");
}
});
}
/**
* 新增文档-map方式 同步
*
* @param indexName 索引名称
* @param id 文档id
* @throws IOException
*/
public void addDocumentMap(String indexName, String id, Map<String, Object> map) throws IOException {
IndexRequest request = new IndexRequest(indexName).id(id).source(map);
esClient.index(request, RequestOptions.DEFAULT);
}
/**
* 新增文档-map方式 异步
*
* @param indexName 索引名称
* @param id 文档id
* @throws IOException
*/
public void addDocumentMapAsync(String indexName, String id, Map<String, Object> map) {
IndexRequest request = new IndexRequest(indexName).id(id).source(map);
esClient.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
log.debug("执行情况: " + indexResponse);
}
@Override
public void onFailure(Exception e) {
log.error("执行失败的原因");
}
});
}
/**
* 更新文档-map方式
*
* @param indexName 索引名称
* @param id 文档id
* @param map 入参map
* @throws IOException
*/
public GetResult updateDocumentMap(String indexName, String id, Map<String, Object> map) throws IOException {
UpdateRequest request = new UpdateRequest(indexName, id).doc(map);
return esClient.update(request, RequestOptions.DEFAULT).getGetResult();
}
/**
* 删除文档
*
* @param indexName
* @param id
* @return
* @throws IOException
*/
public DeleteResponse delete(String indexName, String id) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest(indexName, id);
return esClient.delete(deleteRequest, RequestOptions.DEFAULT);
}
/**
* 查询文档list
*
* @param searchRequest
* @return
* @throws IOException
*/
public SearchResponse getDocumentList(SearchRequest searchRequest) throws IOException {
return esClient.search(searchRequest, RequestOptions.DEFAULT);
}
/**
* multiSearch
*
* @param multiSearchRequest
* @return
* @throws IOException
*/
public MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest)
throws IOException {
log.info("=====query=====:{}", multiSearchRequest);
return esClient.msearch(multiSearchRequest, RequestOptions.DEFAULT);
}
}
测试类
@Data
public class ESDemo {
@JsonProperty("title")
private String title;
@JsonProperty("id")
private Long id;
@JsonProperty("content")
private String content;
public static String[] getAllFields() {
return new String[]{"title", "id", "content"};
}
public static String getTitleField() {
return "title";
}
public static String getIdField() {
return "id";
}
public static String getContentField() {
return "content";
}
}
es demo
package pms.simulation.elasticsearch;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.MultiSearchRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pms.simulation.common.util.ESDemo;
import pms.simulation.common.util.ElasticsearchUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class TestSearcher {
@Autowired
private ElasticsearchUtil elasticsearchUtil;
/**
* 模糊匹配 title
*
* @param indexName 索引名称
* @param from 起始
* @param size 每批条数
* @param title
* @return
*/
public List<ESDemo> queryFuzzTitle(String indexName, Integer from, Integer size, String title) {
MultiSearchRequest multiSearchRequest = new MultiSearchRequest();
SearchRequest searchRequest = new SearchRequest(indexName);
FuzzyQueryBuilder fuzzyQuery =
QueryBuilders.fuzzyQuery(ESDemo.getTitleField(), title).fuzziness(Fuzziness.TWO);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(fuzzyQuery);
sourceBuilder.size(size);
sourceBuilder.from(from);
searchRequest.source(sourceBuilder);
multiSearchRequest.add(searchRequest);
MultiSearchResponse searchResponse;
log.info("=====query=====:{}", sourceBuilder);
List<ESDemo> list = new ArrayList<>();
try {
searchResponse = elasticsearchUtil.multiSearch(multiSearchRequest);
MultiSearchResponse.Item[] responses = searchResponse.getResponses();
for (MultiSearchResponse.Item item : responses) {
SearchResponse response = item.getResponse();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
ESDemo demo = JSON.parseObject(sourceAsString, ESDemo.class);
list.add(demo);
}
}
} catch (IOException e) {
log.error("Search ES Trends Failed : {}", e.getMessage());
}
return list;
}
/**
* 查询文档列表
*
* @param indexName 索引名称
* @param from
* @param size
* @return
* @throws IOException
*/
public List<ESDemo> queryDocumentList(String indexName, Integer from, Integer size) throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.from(from);
searchSourceBuilder.size(size);
searchRequest.source(searchSourceBuilder);
log.info("=====query=====:{}", searchSourceBuilder);
SearchResponse searchResponse;
List<ESDemo> list = new ArrayList<>();
try {
searchResponse = elasticsearchUtil.getDocumentList(searchRequest);
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
ESDemo demo = JSON.parseObject(sourceAsString, ESDemo.class);
list.add(demo);
}
} catch (IOException e) {
log.error("Search ES test_index Failed : {}", e.getMessage());
}
return list;
}
}