elasticsearch搜索引擎下载安装


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;

}


版权声明:本文为qq_33238562原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。