es的搜索基本操作

建立mapping映射

mapping是对索引库中文档的约束,常见的mapping属性包括:

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

    • 数值:long、integer、short、byte、double、float、

    • 布尔:boolean

    • 日期:date

    • 对象:object

  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:

  • 字段名

  • 字段数据类型

  • 是否参与搜索

  • 是否需要分词

  • 如果分词,分词器是什么?

创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:

  • 字段名

  • 字段数据类型

  • 是否参与搜索

  • 是否需要分词

  • 如果分词,分词器是什么?

其中:

  • 字段名、字段数据类型,可以参考数据表结构的名称和类型

  • 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索

  • 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词

  • 分词器我们可以统一使用ik_max_word

  • PUT /hotel
    {
      "mappings": {
        "properties": {
          "id": {
            "type": "keyword"
          },
          "name":{
            "type": "text",
            "analyzer": "ik_max_word",
            "copy_to": "all"
          },
          "address":{
            "type": "keyword",
            "index": false
          },
          "price":{
            "type": "integer"
          },
          "score":{
            "type": "integer"
          },
          "brand":{
            "type": "keyword",
            "copy_to": "all"
          },
          "city":{
            "type": "keyword",
            "copy_to": "all"
          },
          "starName":{
            "type": "keyword"
          },
          "business":{
            "type": "keyword"
          },
          "location":{
            "type": "geo_point"
          },
          "pic":{
            "type": "keyword",
            "index": false
          },
          "all":{
            "type": "text",
            "analyzer": "ik_max_word"
          }
        }
      }
    }

 其中有一个细节 coyp_to是将这个拷贝的all中 后面会用到 到时候再解释

2.批量导入文档

@SpringBootTest
class HotelDemoApplicationTests {

    @Autowired
    private IHotelService hotelService;
    @Autowired
    private RestHighLevelClient client;

    @Test
    public void test() throws IOException {
        //批量查询酒店数据
        List<Hotel> list = hotelService.list();
        //1.创建Request对象
        BulkRequest request =new BulkRequest();
        list.forEach(a->{ 用流拷贝
            // 2.1.转换为文档类型HotelDoc
            HotelDoc hotelDoc = new HotelDoc(a);
            // 2.2.创建新增文档的Request对象
            request.add(new IndexRequest("hotel")//对象名称
                    .id(hotelDoc.getId().toString())
                    .source(JSON.toJSONString(hotelDoc), XContentType.JSON));
        });
         // 3.发送请求
        client.bulk(request, RequestOptions.DEFAULT);
    }

    @BeforeEach //初始化客户端
    void setUp() {
        HttpHost host=HttpHost.create("http://192.168.19.128:9200");
        RestClientBuilder builder= RestClient.builder(host);
        client=new RestHighLevelClient(builder);
    }

    @AfterEach//关流
    void tearDown() throws IOException {
        client.close();
    }
}

将mysql中的数据导入es中 

es搜索命令

在启动类下 将RestHighLevelClient注册到Spring中作为一个Bean 

注意:其中的ip是你的es的ip和端口记得改!!!!

@Bean //将客户端交给spring管理
public RestHighLevelClient client(){
    return  new RestHighLevelClient(RestClient.builder(
        HttpHost.create("http://192.168.150.101:9200")
    ));
}

返回值的实体类

package cn.itcast.hotel.pojo;

import lombok.Data;

import java.util.List;

@Data
public class PageResult {
    private Long total;
    private List<HotelDoc> hotels;

    public PageResult() {
    }

    public PageResult(Long total, List<HotelDoc> hotels) {
        this.total = total;
        this.hotels = hotels;
    }
}

 接受数据的实体类

package cn.itcast.hotel.pojo;

import lombok.Data;

@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
}

基础的查询  

@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {

    @Resource
    private HotelMapper hotelMapper;

    @Resource
    private RestHighLevelClient client;

    @Override
    public PageResult search(RequestParams params) throws IOException {
        //准备Request
        SearchRequest request = new SearchRequest("hotel");//操作的数组
        //准备DSL 
        String key = params.getKey();
        if (key!=null&&key!="") { //判断key是否有值 如果有就按搜索框内容搜索
            //Query
            request.source()
                    .query(QueryBuilders.matchQuery("all", key));
        }else { //如果没有值 则查询所有
            request.source()
                    .query(QueryBuilders.matchAllQuery());
        }
        //发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        SearchHits searchHits = search.getHits();
        PageResult pageResult = new PageResult();
        pageResult.setTotal(searchHits.getTotalHits().value);//将查询到的所有条数返回
        SearchHit[] hits = searchHits.getHits();
        ArrayList<HotelDoc> list = new ArrayList<>();
        for (SearchHit hit : hits) {//将搜索的数据进行封装
            // 获取文档source
            String json = hit.getSourceAsString();
            // 反序列化                            将json数据转换为HotelDoc格式
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            // 放入集合
            list.add(hotelDoc);
        }
        pageResult.setHotels(list);
        // 4.4.封装返回
        return  pageResult;
    }

 这个只是基础版本 只能做基本的输入框的查询和全部查询

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值