ES搜索引擎入门+最佳实践(二)

ES在搜索和数据分析中的应用越来越广泛,在之前项目中对ES的使用有些心得,最近有不少朋友和同事都问到了ES,刚好最近也有些时间,所以打算通过8~10篇文章介绍下ES.(其实我也不知道最终会写下多少篇)

ES搜索引擎入门+最佳实践(一)_flame.liu的博客-CSDN博客

一.概述

        在上一篇文章中,介绍了ES的概念,以及ES工具的安装,并且粗略的窥视了ES一眼.本篇文章主要介绍Spring Boot通过RestHighLevelClient链接ES并进行搜索.

二.RestHighLevelClient简介

        RestHighLevelClient是ES官方高级客户端,通过HTML与ES进行通信,基于低级客户端,它提供了更多的接口.

三.设置ES用户名和密码

3.1  修改elasticsearch.yml文件

        需要在配置文件中开启x-pack验证:修改config目录下面的elasticsearch.yml文件,在里面添加如下内容:

# 配置X-Pack
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

3.2 重启elasticsearch服务

        关掉重开就是

3.3 设置elastic密码

        如果你是windows系统,需要使用cmd到dos命令进去,转到elasticsearch的bin文件夹中,执行下面这个命令:

elasticsearch-setup-passwords interactive

然后在提示中选择y,表示开始设置,密码最少需要6位,需要设置多过内置账户的密码,这里因为时候开发环境,所以密码都设置成"sasa123456".

 输入密码的时候只能盲输,看不到*.

3.4 验证密码

重启客户端,在浏览器中输入 http://localhost:9200  这时会需要你输入刚才的用户名和密码,我们通常可以使用elastic作为用户名.

四.配置RestHighLevelClient

        配置restHighLevelClient通常需要2个步骤,分配是引入依赖,配置yml文件,接下来一 一介绍:

4.1 引入依赖

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.17.11</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.17.11</version>
        </dependency>

注意版本号与你的ES保持一致,低一点没有问题,大不了缺少些功能,高一点的话可能有些功能会匹配不少而造成错误.

4.2 在yml文件中配置用户名和密码

elasticsearch:              #必须是根节点
  rest:
    hosts: 127.0.0.1:9200   #ES服务器路径
    username: elastic
    password: sasa123456

 这里注意elasticsearch是根节点,我们后面需要通过@value注解读取数据,而不是在spring节点下面elasticsearch的配置.

五.读取

5.1 设置实体类与ES索引对应

package com.flamelp.clientgoods.pojo;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ESGoods {
    //ES搜索结果特有属性
    String id;
    String index;
    Float score;
    //之前定义ES索引设置的属性
    String title;
    String detailContent;
    Double price;
}

5.2 设置服务类读取ES索引中的数据

package com.flamelp.clientgoods.service.impl;

import com.flamelp.clientgoods.pojo.ESGoods;
import jakarta.annotation.Resource;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class EsService {
    @Resource
    RestHighLevelClient client;

    /**
     * 根据关键字查询商品信息
     * @param keyword
     * @return
     */
    public List<ESGoods> getGoodsFromTitle(String keyword){
        //fresh_mall是之前创建的索引名称
        SearchRequest searchRequest=new SearchRequest("fresh_mall");//客户端请求
        SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("title",keyword));//构建query
        searchRequest.source(searchSourceBuilder);//将构建的查询内容配置到请求中
        List<ESGoods> resultList=new ArrayList<ESGoods>();
        try{
            SearchResponse searchResponse=client.search(searchRequest, RequestOptions.DEFAULT);
            RestStatus status = searchResponse.status();
            if(status!=RestStatus.OK){  //如果结果返回不正确,那么返回null
                return null;
            }
            SearchHits searchHits=searchResponse.getHits();
            for(SearchHit searchHit:searchHits){
                ESGoods hotel=new ESGoods();
                hotel.setId(searchHit.getId());                                 //文档_id
                hotel.setIndex(searchHit.getIndex());                           //索引名称
                hotel.setScore(searchHit.getScore());                           //文档得分
                //转换为Map
                Map<String, Object> dataMap= searchHit.getSourceAsMap();
                hotel.setTitle((String) dataMap.get("title"));  //设置标题
                hotel.setDetailContent((String) dataMap.get("detailContent"));//设置描述信息
                hotel.setPrice((Double) dataMap.get("price"));  //设置价格
                resultList.add(hotel);
            }
            return resultList;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

5.3 controller展现数据

在goodsController类中添加方法,获得ESService返回的数据并呈现

    @GetMapping("getESGoods")
    public List<ESGoods> getESGoods(){
        List<ESGoods> goodsList =esService.getGoodsFromTitle("红富士苹果");
        return goodsList;
    }

在这里,就把ESService当做一个普通的service类调用就可以了.

启动并打开controller对应的网页,可以得到如下结果:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值