import com.yuepu.common.core.domain.BaseEntity;
import lombok.Data;
import java.util.Date;
import java.util.Map;
@Data
public class EsQuery extends BaseEntity {
// 实体设置参数样例
// String[] fieldNames = new String[]{"title", "top_words"};
// esQuery.setIndex("xiaohongshu_note_test");
// esQuery.setAccountId(1);
// esQuery.setContent("可口可乐");
// esQuery.setSortField("publish_time");
// esQuery.setStartPage(1);
// esQuery.setPageSize(10);
// esQuery.setFieldNames(fieldNames);
// Page<Map<String, Object>> list = elasticsearchUtil.searchDataPage(esQuery);
// esQuery.setBeginTime("2020-08-25");
// esQuery.setEndTime("2021-08-25");
// index 索引
private String index;
// accountId 账号id索引
private Integer accountId;
// content 查询值
private String content = "";
// 笔记 排序字段
private String sortField = "publish_time";
// 笔记 排序 asc desc
private String sort = "desc";
// fieldNames 查询字段可以多字段查询
private String[] fieldNames;
// 笔记 开始页
private int startPage;
// 笔记 每页条数
private int pageSize;
// 开始时间
private String beginTime;
// 结束时间
private String endTime;
// 排除关键字
private String exclude = "";
// 平台id
private String[] platformId;
// 列表 页码
private int page;
// 列表 每条数量
private int size;
// 列表 排序字段
private String listSortField = "";
// 列表 排序
private String listSort = "desc";
}
安装之前需满足的条件:jdk,node.js
第一步: 下载elasticsearch、分词器、还有kabana插件(我这里的版本使用的均为6.7.0版本的)
下载地址:https://pan.baidu.com/s/1KfDhymRLhSM8fHz7fTUmww
提取码:mr4n
解压:解压缩到对应的目录,如:D:\elasticsearch\elasticsearch-6.7.0
修改D:\elasticsearch\elasticsearch-6.7.0\config下的elasticsearch.yml配置文件
启动:进入elasticsearch-6.7.0的bin目录,双击elasticsearch.bat启动服务,默认端口是9200,如下图
启动完成之后,在浏览器中访问http://localhost:9200/,出现如下图所示内容表明Elasticsearch启动成功:
第二步:在D:\elasticsearch\elasticsearch-6.7.0\plugins下新建ik文件夹,将对应版本的分词器解压到改文件夹下,如图:
第三步: 将kibana解压到D:\elasticsearch\elasticsearch-6.7.0下,如图:
双击 D:\elasticsearch\elasticsearch-6.7.0\kibana-6.7.0-windows-x86_64\bin下的kibana.bat启动(在此之前先启动elasticsearch,也就是文章中第一步中的启动),耐心稍等片刻,待出现下图:
- 在窗口日志的最后,当看到一行提示信息
[listening] Server running at http://localhost:5601
,表明kibana
已经成功启动,并且监听本机的5601端口
如何下载elasticsearch历史版本: 请参考该文章:https://jingyan.baidu.com/article/d7130635f5a27113fdf4753c.html
另外:如何下载历史版本的分词器:
地址:mirrors / medcl / elasticsearch-analysis-ik · CODE CHINA
点击页面中的tags
选择对应的版本:如6.7.0
如果展开的页面中没有你要找的版本,就next,知道找到你要下载的版本,然后选择zip下载:如图
kibana历史版本下载:Past Releases of Elastic Stack Software | Elastic
以下为查询展示示例
java中实现的方式
1、工具类
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson.JSONObject;
import com.yuepu.front.pojo.EsQuery;
import com.yuepu.front.pojo.Page;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.HttpAsyncResponseConsumerFactory;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.filter.Filters;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedDateHistogram;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.metrics.cardinality.ParsedCardinality;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import com.alibaba.fastjson.JSON;
import lombok.extern.log4j.Log4j2;
@Component
@Log4j2
public class ElasticsearchUtil {
private static final RequestOptions COMMON_OPTIONS;
@Value("${spring.elasticsearch.cluster_host}")
private String cluster_host;
@Value("${spring.elasticsearch.cluster_port}")
private Integer cluster_port;
@Value("${spring.elasticsearch.username}")
private String username;
@Value("${spring.elasticsearch.password}")
private String password;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// 默认缓存限制为100MB,此处修改为30MB。
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(100 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
public RestHighLevelClient getEsClient() {
// 阿里云Elasticsearch集群需要basic auth验证。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//访问用户名和密码,创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(this.username, this.password));
// 通过builder创建rest client,配置http client的HttpClientConfigCallback。
// 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
RestClientBuilder builder = RestClient.builder(new HttpHost(this.cluster_host, this.cluster_port))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// RestHighLevelClient实例通过REST low-level client builder进行构造。
RestHighLevelClient highClient = new RestHighLevelClient(builder);
return highClient;
}
/**
* 创建索引
*
* @param index
* @throws IOException
*/
public void createIndex(String index) throws IOException {
if (!existsIndex(index)) {
CreateIndexRequest request = new CreateIndexRequest(index);
CreateIndexResponse createIndexResponse = getEsClient().indices().create(request, COMMON_OPTIONS);
System.out.println("createIndex: " + JSON.toJSONString(createIndexResponse));
}
}
/**
* 判断索引是否存在
*
* @param index
* @return
* @throws IOException
*/
public boolean existsIndex(String index) throws IOException {
GetIndexRequest request = new GetIndexRequest(index);
boolean exists = getEsClient().indices().exists(request, COMMON_OPTIONS);
System.out.println("existsIndex: " + exists);
return exists;
}
/**
* 根据条件删除数据
*
* @param index 索引
* @param builder 删除条件
*/
public void deleteByQuery(String index, QueryBuilder builder) {
DeleteByQueryRequest request = new DeleteByQueryRequest(index);
request.setQuery(builder);
//设置此次删除的最大条数
request.setBatchSize(1000);
try {
getEsClient().deleteByQuery(request, COMMON_OPTIONS);
} catch (Exception e) {
log.error("根据条件删除数据失败,index:{}", index);
}
}
/**
* 根据条件查询数据
*/
public Page<Map<String, Object>> searchDataPage(EsQuery esQuery) {
SearchRequest request = new SearchRequest(esQuery.getIndex());
request.types("_doc");
QueryBuilder queryBuilder;
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (null != (esQuery.getBeginTime()) && null != (esQuery.getEndTime())) {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), getTimestamp(esQuery.getBeginTime()), getTimestamp(esQuery.getEndTime()), esQuery.getFieldNames());
} else {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), esQuery.getFieldNames());
}
try {
//加载查询条件
sourceBuilder.query(queryBuilder);
RestHighLevelClient highClient = getEsClient();
long totalHits = searchDataPageCount(esQuery.getIndex(), sourceBuilder, highClient);
if (null != (esQuery.getFieldNames()) ){
HighlightBuilder highlightBuilder = createHighlightBuilder(esQuery.getFieldNames());
if (!ObjectUtils.isEmpty(highlightBuilder)) {
sourceBuilder.highlighter(highlightBuilder);
}
}
//设置超时时间
sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
//设置是否按匹配度排序
sourceBuilder.explain(true);
if ("".equals(esQuery.getSortField())) {
esQuery.setSortField("publish_time");
}
if ("asc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.ASC);
} else if ("desc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.DESC);
}
request.source(sourceBuilder);
//设置分页
sourceBuilder.from((esQuery.getStartPage() - 1) * esQuery.getPageSize()).size(esQuery.getPageSize());
log.info("查询返回条件:" + sourceBuilder.toString());
SearchResponse searchResponse = highClient.search(request, COMMON_OPTIONS);
//Long totalHits = searchResponse.getHits().toXContent(builder, params);
log.info("共查出{}条记录", totalHits);
RestStatus status = searchResponse.status();
if (status.getStatus() == 200) {
List<Map<String, Object>> sourceList = new ArrayList<>();
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
Map<String, Object> map = new HashMap<>();
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
sourceAsMap.put("publish_time", stampToDate(sourceAsMap.get("publish_time")));
map.put("source", sourceAsMap);
// 处理高亮数据
Map<String, Object> hitMap = new HashMap<>();
searchHit.getHighlightFields().forEach((k, v) -> {
String hight = "";
for (Text text : v.getFragments()) hight += text.string();
hitMap.put(v.getName(), hight);
});
map.put("highlight", hitMap);
sourceList.add(map);
}
Page<Map<String, Object>> page = new Page<Map<String, Object>>();
page.setPageNo(esQuery.getStartPage());
page.setPageNum((int) Math.ceil((int) totalHits / esQuery.getPageSize()));
page.setPageSize(esQuery.getPageSize());
page.setTotal((int) totalHits);
page.setRows(sourceList);
return page;
}
highClient.close();
} catch (IOException e) {
System.err.println(e.getMessage());
log.error("条件查询索引{}时出错", esQuery.getIndex());
}
return null;
}
public static String stampToDate(Object o){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(o.toString());
Date date = new Date(lt);
String res = simpleDateFormat.format(date);
return res;
}
// 根据条件时间 去查询所有的作品 不分页
public List<Map<String, Object>> searchData(EsQuery esQuery) {
SearchRequest request = new SearchRequest(esQuery.getIndex());
QueryBuilder queryBuilder;
request.types("_doc");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (null != (esQuery.getBeginTime()) && null != (esQuery.getEndTime())) {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), getTimestamp(esQuery.getBeginTime()), getTimestamp(esQuery.getEndTime()), esQuery.getFieldNames());
} else {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), esQuery.getFieldNames());
}
try {
//加载查询条件
sourceBuilder.query(queryBuilder);
RestHighLevelClient highClient = getEsClient();
long totalHits = searchDataPageCount(esQuery.getIndex(), sourceBuilder, highClient);
//设置超时时间
sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
//设置是否按匹配度排序
sourceBuilder.explain(true);
if ("".equals(esQuery.getSortField())) {
esQuery.setSortField("publish_time");
}
if ("asc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.ASC);
} else if ("desc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.DESC);
}
request.source(sourceBuilder);
//设置查询所有
sourceBuilder.from(1).size((int) totalHits);
SearchResponse searchResponse = highClient.search(request, COMMON_OPTIONS);
RestStatus status = searchResponse.status();
if (status.getStatus() == 200) {
List<Map<String, Object>> sourceList = new ArrayList<>();
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
Map<String, Object> map = new HashMap<>();
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
sourceAsMap.put("publish_time",sdf.format(sourceAsMap.get("publish_time")));
map.put("source", sourceAsMap);
sourceList.add(map);
}
return sourceList;
}
highClient.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
return null;
}
// 获取关键词keyword
public List<Map<String, Object>> searchKeyWord(EsQuery esQuery) {
SearchRequest request = new SearchRequest(esQuery.getIndex());
QueryBuilder queryBuilder;
request.types("_doc");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (null != (esQuery.getBeginTime()) && null != (esQuery.getEndTime())) {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), getTimestamp(esQuery.getBeginTime()), getTimestamp(esQuery.getEndTime()), esQuery.getFieldNames());
} else {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), esQuery.getFieldNames());
}
try {
//加载查询条件
sourceBuilder.query(queryBuilder);
RestHighLevelClient highClient = getEsClient();
long totalHits = searchDataPageCount("索引1,索引2,索引3,...", sourceBuilder, highClient);
//设置超时时间
sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
//设置是否按匹配度排序
sourceBuilder.explain(true);
if ("".equals(esQuery.getSortField())) {
esQuery.setSortField("publish_time");
}
if ("asc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.ASC);
} else if ("desc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.DESC);
}
request.source(sourceBuilder);
//设置查询所有
sourceBuilder.from(1).size((int) totalHits);
SearchResponse searchResponse = highClient.search(request, COMMON_OPTIONS);
RestStatus status = searchResponse.status();
if (status.getStatus() == 200) {
List<Map<String, Object>> sourceList = new ArrayList<>();
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
Map<String, Object> map = new HashMap<>();
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
map.put("top_words", sourceAsMap.get("top_words"));
sourceList.add(map);
}
return sourceList;
}
highClient.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
return null;
}
// 根据条件时间 去查询所有的作品 不分页
public Map<String, Map> searchDatas(EsQuery esQuery) {
SearchRequest request = new SearchRequest(esQuery.getIndex());
RestHighLevelClient client = getEsClient();
QueryBuilder queryBuilder;
request.types("_doc");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (null != (esQuery.getBeginTime()) && null != (esQuery.getEndTime())) {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), getTimestamp(esQuery.getBeginTime()), getTimestamp(esQuery.getEndTime()), esQuery.getFieldNames());
} else {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), esQuery.getFieldNames());
}
try {
//加载查询条件
sourceBuilder.query(queryBuilder);
//聚合函数
sourceBuilder.aggregation(AggregationBuilders.dateHistogram
("brandAgg").field("publish_time").dateHistogramInterval(DateHistogramInterval.DAY).format("yyyy-MM-dd").subAggregation(AggregationBuilders.cardinality("user_count").field("user_id")));
//设置超时时间
sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
//设置是否按匹配度排序
sourceBuilder.explain(true);
if ("".equals(esQuery.getSortField())) {
esQuery.setSortField("publish_time");
}
if ("asc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.ASC);
} else if ("desc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.DESC);
}
//设置查询所有
sourceBuilder.from(0);
request.source(sourceBuilder);
SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
ParsedDateHistogram parsedDateHistogram = searchResponse.getAggregations().get("brandAgg");;
List parsedBucketList = parsedDateHistogram.getBuckets();
List<Map<String, Object>> sourceList = new ArrayList<>();
RestStatus status = searchResponse.status();
Map<String, Object> sourceAsMap = new HashMap<>();
Map<String, Object> sourceAsMaps = new HashMap<>();
Map<String, Map> map = new HashMap<>();
if (status.getStatus() == 200) {
for (Object bucket : parsedBucketList) {
ParsedDateHistogram.ParsedBucket parsedBucket = (ParsedDateHistogram.ParsedBucket) bucket;
ParsedCardinality cardinality = parsedBucket.getAggregations().get("user_count");
sourceAsMap.put(parsedBucket.getKeyAsString(), parsedBucket.getDocCount());
sourceAsMaps.put(parsedBucket.getKeyAsString(), cardinality.getValue());
}
map.put("sourceAsMap",sourceAsMap);
map.put("sourceAsMaps",sourceAsMaps);
return map;
}
client.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
return null;
}
//获取条件查询来的作品 accountId
public List searchDataId(EsQuery esQuery) {
List idList = new ArrayList();
SearchRequest request = new SearchRequest(esQuery.getIndex());
RestHighLevelClient client = getEsClient();
QueryBuilder queryBuilder;
request.types("_doc");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (null != (esQuery.getBeginTime()) && null != (esQuery.getEndTime())) {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), getTimestamp(esQuery.getBeginTime()), getTimestamp(esQuery.getEndTime()), esQuery.getFieldNames());
} else {
queryBuilder = createQueryBuilder(esQuery.getContent(), esQuery.getAccountId(), esQuery.getExclude(), esQuery.getFieldNames());
}
try {
//加载查询条件
sourceBuilder.query(queryBuilder);
//聚合函数
sourceBuilder.aggregation(AggregationBuilders.terms("accountId").field("account_id").size(100000));
//设置超时时间
sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
//设置是否按匹配度排序
sourceBuilder.explain(true);
if ("".equals(esQuery.getSortField())) {
esQuery.setSortField("publish_time");
}
if ("asc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.ASC);
} else if ("desc".equals(esQuery.getSort())) {
sourceBuilder.sort(esQuery.getSortField(), SortOrder.DESC);
}
request.source(sourceBuilder);
//设置查询所有
sourceBuilder.from(0);
SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
// 获取某个聚合
Terms terms = aggregations.get("accountId");
RestStatus status = searchResponse.status();
if (status.getStatus() == 200) {
// 获取桶
for (Terms.Bucket bucket : terms.getBuckets()) {
// 获取key,这里是accountId
idList.add(bucket.getKeyAsString());
}
return idList;
}
client.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
return null;
}
public long searchDataPageCount(String index, SearchSourceBuilder sourceBuilder, RestHighLevelClient highClient) {
CountRequest countRequest = new CountRequest(index);
countRequest.source(sourceBuilder);
try {
CountResponse response = highClient.count(countRequest, COMMON_OPTIONS);
long length = response.getCount();
return length;
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
/**1630398050066
* 1630398054019
* 构建高亮字段 进行 多字段模糊查询
* 创建查询语句
*/
private QueryBuilder createQueryBuilder(String content, Integer accountId, String exclude, Long beginTime, Long endTime, String... fieldNames) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//自定义条件(Operator.AND 表示匹配包含值)
if (!"".equals(content)) {
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(content, fieldNames).operator(Operator.OR).minimumShouldMatch("50%"));
}
if (!"".equals(exclude)) {
boolQueryBuilder.mustNot(QueryBuilders.multiMatchQuery(exclude, fieldNames).operator(Operator.OR).minimumShouldMatch("50%"));
}
if (null != accountId) {
boolQueryBuilder.must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("account_id", accountId)));
}
boolQueryBuilder.must(QueryBuilders.boolQuery().should(QueryBuilders.rangeQuery("publish_time").from(beginTime).to(endTime)));
return boolQueryBuilder;
}
private QueryBuilder createQueryBuilder(String content, Integer accountId, String exclude, String... fieldNames) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//自定义条件(Operator.AND 表示匹配包含值)
if (!"".equals(content)) {
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(content, fieldNames).operator(Operator.OR).minimumShouldMatch("50%"));
}
if (!"".equals(exclude)) {
boolQueryBuilder.mustNot(QueryBuilders.multiMatchQuery(exclude, fieldNames).operator(Operator.OR).minimumShouldMatch("50%"));
}
if (null != accountId) {
boolQueryBuilder.must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("account_id", accountId)));
}
return boolQueryBuilder;
}
/**
* 构造高亮器
*
* @auther: guangz
* @date: 2019/8/26 10:42
*/
private HighlightBuilder createHighlightBuilder(String... fieldNames) {
// 设置高亮,使用默认的highlighter高亮器
HighlightBuilder highlightBuilder = new HighlightBuilder()
// .field("productName")
.preTags("<span style='color:red'>")
.postTags("</span>");
// 设置高亮字段
for (String fieldName : fieldNames) {
highlightBuilder.field(fieldName);
}
return highlightBuilder;
}
/*
QueryBuilders.termQuery("key", obj) 完全匹配
QueryBuilders.termsQuery("key", obj1, obj2..) 一次匹配多个值
QueryBuilders.matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性
QueryBuilders.multiMatchQuery("text", "field1", "field2"..); 匹配多个字段, field有通配符忒行
QueryBuilders.matchAllQuery(); 匹配所有文件
*/
/**
* @param time
* @desc 字符串转时间戳
* @example time="2019-04-19 00:00:00"
**/
public Long getTimestamp(String time) {
Long timestamp = null;
try {
timestamp = new SimpleDateFormat("yyyy-MM-dd").parse(time).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return timestamp;
}
}
2、实体类
import com.yuepu.common.core.domain.BaseEntity;
import lombok.Data;
@Data
public class EsQuery extends BaseEntity {
// 实体设置参数样例
// String[] fieldNames = new String[]{"title", "top_words"};
// esQuery.setIndex("xiaohongshu_note_test");
// esQuery.setAccountId(1);
// esQuery.setContent("可口可乐");
// esQuery.setSortField("publish_time");
// esQuery.setStartPage(1);
// esQuery.setPageSize(10);
// esQuery.setFieldNames(fieldNames);
// Page<Map<String, Object>> list = elasticsearchUtil.searchDataPage(esQuery);
// esQuery.setBeginTime("2020-08-25");
// esQuery.setEndTime("2021-08-25");
// index 索引
private String index;
// accountId 账号id索引
private Integer accountId;
// content 查询值
private String content = "";
// 笔记 排序字段
private String sortField = "publish_time";
// 笔记 排序 asc desc
private String sort = "desc";
// fieldNames 查询字段可以多字段查询
private String[] fieldNames;
// 笔记 开始页
private int startPage;
// 笔记 每页条数
private int pageSize;
// 开始时间
private String beginTime;
// 结束时间
private String endTime;
// 排除关键字
private String exclude = "";
// 平台id
private String[] platformId;
// 列表 页码
private int page;
// 列表 每条数量
private int size;
// 列表 排序字段
private String listSortField = "";
// 列表 排序
private String listSort = "desc";
}
controller类:
/**
* 账号原贴展示列表(排序可根据发布时间/互动量) 默认按发布时间
* */
@PreAuthorize("@ss.hasPermi('front:bili:note:es')")
@PostMapping("/es")
public AjaxResult es(@Validated EsQueryDto esQueryDto)
{
logger.info("----------------- 账号原贴展示列表 start -----------------");
logger.info("请求接口: front/bili/note/es");
logger.info("请求参数EsQueryDto:"+esQueryDto);
// index es索引
String index="bilibili_video_test";
esQueryDto.setIndex(index);
// 查询关键词 来源字段
String[] fieldNames=new String[]{"top_words","title","description"};
esQueryDto.setFieldNames(fieldNames);
Page<Map<String, Object>> map=commonUtilService.selectNoteBrandAnalyseEs(esQueryDto);
logger.info("----------------- 账号原贴展示列表 end ----------------- ");
return AjaxResult.success(map);
}
业务逻辑层
@Override
public Page<Map<String, Object>> selectNoteBrandAnalyseEs(EsQueryDto esQueryDto) {
Page<Map<String, Object>> map= new Page<>();
try {
EsQuery esQuery=new EsQuery();
esQuery.setIndex(esQueryDto.getIndex());
esQuery.setAccountId(esQueryDto.getAccountId());
// 如果排序字段为null 默认根据publish_time 字段进行排序
String sortField=esQueryDto.getSortField()==null?"publish_time":esQueryDto.getSortField();
esQuery.setSortField(sortField);
// String[] fieldNames=new String[]{"content"};
esQuery.setFieldNames(esQueryDto.getFieldNames());
esQuery.setContent(esQueryDto.getContent());
esQuery.setStartPage(esQueryDto.getStartPage());
esQuery.setPageSize(esQueryDto.getPageSize());
esQuery.setBeginTime(esQueryDto.getBeginTime());
esQuery.setEndTime(esQueryDto.getEndTime());
map= elasticsearchUtil.searchDataPage(esQuery);
} catch (Exception e) {
log.error("获取"+esQueryDto.getIndex()+"达人原贴程序异常:"+e.getMessage());
throw new RuntimeException("获取达人原贴程序异常");
}
return map;
}
请求实体类
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class EsQueryDto {
// 实体设置参数样例
// String[] fieldNames = new String[]{"title", "top_words"};
// esQuery.setIndex("xiaohongshu_note_test");
// esQuery.setAccountId(1);
// esQuery.setContent("可口可乐");
// esQuery.setSortField("publish_time");
// esQuery.setStartPage(1);
// esQuery.setPageSize(10);
// esQuery.setFieldNames(fieldNames);
// Page<Map<String, Object>> list = elasticsearchUtil.searchDataPage(esQuery);
// esQuery.setBeginTime("2020-08-25");
// esQuery.setEndTime("2021-08-25");
// index 索引
/** ES索引*/
private String index;
/** 账号id */
@NotNull(message = "accountId 不能为null")
private Integer accountId;
/** 查询值 */
private String content = "";
/** 排序字段 */
private String sortField ;
/** 查询字段可以多字段查询 */
private String[] fieldNames;
/** 开始页 */
@NotNull(message = "startPage 不能为null")
private int startPage;
/** 每页条数 */
@NotNull(message = "pageSize 不能为null")
private int pageSize;
/** 开始时间 */
@NotBlank(message = "beginTime 不能为null")
private String beginTime;
/** 结束时间 */
@NotBlank(message = "endTime 不能为null")
private String endTime;
}