ElasticSearch增删改查、搜索实现、搜索结果解析

对ElasticSearch的索引库的增删改查示例java代码

1. 查询

GET /app_info_article/_search
{
  "query": {
    "multi_match": {
      "query": "你的搜索词",  // 替换为 dto.getSearchWords() 的值
      "fields": ["title", "content"]
    }
  },
  "highlight": {
    "pre_tags": ["<font style='color:red;font-size:inherit;'>"],
    "post_tags": ["</font>"],
    "fields": {
      "title": {}
    }
  },
  "from": 你的索引计算值,  // 替换为 (dto.getPageNum() * dto.getPageSize())
  "size": dto.getPageSize(),  // 替换为 dto.getPageSize() 的值
  "sort": [
    {
      "publishTime": {
        "order": "desc"
      }
    }
  ]
}

对应的java代码

/***
     * 搜索实现
     * @param dto
     * @return
     */
    @Override
    public ResponseResult search(UserSearchDto dto) throws IOException {
        //1)创建SearchRequest
        SearchRequest request = new SearchRequest("app_info_article");
        //2)封装查询条件  如果搜索关键词不为空,则根据标题或者内容搜索
        if(!ObjectUtils.isEmpty(dto.getSearchWords())){
            //已经输入了关键词,用户如果已登陆,则异步保存该搜索  userId=0 有课 userId!=0  用户已登录
            Integer userId = RequestContextUtil.get("id");
            if(userId!=0){
                saveHistory(dto.getSearchWords(),userId);
            }

            request.source().query(QueryBuilders.multiMatchQuery(dto.getSearchWords(),"title","content"));
        }else{
            //3)如果搜索关键词为空,则查询所有
            request.source().query(QueryBuilders.matchAllQuery());
        }

        //4)高亮-标题高亮
        request.source().highlighter(
                new HighlightBuilder()
                        .field("title")
                        .preTags("<font style='color:red;font-size:inherit;'>")
                .postTags("</font>")
        );

        //5)分页
        int index = (dto.getPageNum())*dto.getPageSize();
        request.source().from(index).size(dto.getPageSize());

        //6)排序
        request.source().sort("publishTime", SortOrder.DESC);

        //7)结果集解析
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();

        for (SearchHit hit : response.getHits().getHits()) {
            //7.1)获取每个source对象
            Map<String, Object> map = hit.getSourceAsMap();
            map.put("h_title",map.get("title"));

            //8)高亮
            if(hit.getHighlightFields()!=null && hit.getHighlightFields().get("title")!=null){
                //8.1)标题高亮数据
                HighlightField highlightField = hit.getHighlightFields().get("title");
                String highlightTitle = StringUtils.join(highlightField.getFragments(), "..");

                //8.2)存在高亮数据,则换掉默认的非高亮
                map.put("h_title",highlightTitle);
            }

            list.add(map);
        }
        return ResponseResult.okResult(list);
    }

结果集解析
在这里插入图片描述

2. 增

2.1 增加单个

/***
 * 增加索引
 * @param searchArticleVo
 */
public void addIndex(SearchArticleVo searchArticleVo) throws IOException {
    //1)创建IndexRequest
    IndexRequest request = new IndexRequest("app_info_article")
            //2)封装DSL语句
            //ID
            .id(searchArticleVo.getId().toString())
            .source(JSON.toJSONString(searchArticleVo), XContentType.JSON);

    //3)使用RestHighLevelClient发送请求
    restHighLevelClient.index(request, RequestOptions.DEFAULT);
}

2.2 增加多个

/**
     * 注意:数据量的导入,如果数据量过大,需要分页导入
     *  1)查询数据库数据
     *  2)将数据写入到ES中即可
     *     创建BulkRequest
     *            ================================
     *            ||A:创建XxxRequest
     *            ||B:向XxxRequest封装DSL语句数据
     *            ||                             X C:使用RestHighLevelClient执行远程请求
     *            ================================
     *            将XxxRequest添加到BulkRequest
     *       使用RestHighLevelClient将BulkRequest添加到索引库
     * @throws Exception
     */
    @Test
    public void init() throws Exception {
        //1)查询数据库数据
        List<SearchArticleVo> searchArticleVos = apArticleMapper.loadArticleList();

        //2)创建BulkRequest - 刷新策略
        BulkRequest bulkRequest = new BulkRequest()
                //刷新策略-立即刷新
                .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
        for (SearchArticleVo searchArticleVo : searchArticleVos) {
            //A:创建XxxRequest
            IndexRequest indexRequest = new IndexRequest("app_info_article")
                    //B:向XxxRequest封装DSL语句数据
                    .id(searchArticleVo.getId().toString())
                    .source(JSON.toJSONString(searchArticleVo), XContentType.JSON);

            //3)将XxxRequest添加到BulkRequest
            bulkRequest.add(indexRequest);
        }

        //4)使用RestHighLevelClient将BulkRequest添加到索引库
        restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    }

3. 删

3.1 删除单个

/**
     * 、删除索引
     * @param searchArticleVo
     */
    public void deleteIndex(SearchArticleVo searchArticleVo) throws IOException {
        //1)创建XxxRequest
        DeleteRequest request = new DeleteRequest("app_info_article")
                //2)封装DSL语句
                .id(searchArticleVo.getId().toString());

        //3)使用RestHighLevelClient发送请求
        restHighLevelClient.delete(request,RequestOptions.DEFAULT);
    }

3.2 删除多个

待更新…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值