6.26_JAVA_微服务_Elasticsearch

发布于:2025-06-27 ⋅ 阅读:(14) ⋅ 点赞:(0)

1、ES文档中keyword意思是:字符串,但不需要分词

2、ES细节CreateIndexRequest request = new CreateIndexRequest("items");会让你导包,会有两个选择:

        import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;

        import org.elasticsearch.client.indices.CreateIndexRequest;

一般选择带client的那个,因为这个用于ES7之后的。而我们IDEA使用的是ES7.12.1

3、ES中文档:document;     库:index

4、下面这个是多个文档(document),而不是一个文档。它们可以存在一个库里。

{
    "id": 1,
    "title": "小米手机",
    "price": 3499
}
{
    "id": 2,
    "title": "华为手机",
    "price": 4999
}
{
    "id": 3,
    "title": "华为小米充电器",
    "price": 49
}
{
    "id": 4,
    "title": "小米手环",
    "price": 299
}

 5、不光mapper层可以查询等操作,MP自带的Iservice也可以。

@Test
void testLoadItemDocs() throws IOException {
    // 分页查询商品数据
    int pageNo = 1;
    int size = 1000;
    while (true) {
        Page<Item> page = itemService.lambdaQuery().eq(Item::getStatus, 1).page(new Page<Item>(pageNo, size));
        // 非空校验
        List<Item> items = page.getRecords();
        if (CollUtils.isEmpty(items)) {
            return;
        }
        log.info("加载第{}页数据,共{}条", pageNo, items.size());
        // 1.创建Request
        BulkRequest request = new BulkRequest("items");
        // 2.准备参数,添加多个新增的Request
        for (Item item : items) {
            // 2.1.转换为文档类型ItemDTO
            ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);
            // 2.2.创建新增文档的Request对象
            request.add(new IndexRequest()
                            .id(itemDoc.getId())
                            .source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON));
        }
        // 3.发送请求
        client.bulk(request, RequestOptions.DEFAULT);

        // 翻页
        pageNo++;
    }
}

Page<Item> page = itemService.lambdaQuery().eq(Item::getStatus, 1).page(new Page<Item>(pageNo, size));这个lambdaQuery是ItemService继承了Iservice然后Iservice中写了lambdaQuery这个在service层就可以查询的方法。

6、ES的DSL查询分为叶子查询和复合查询

7、看到这个算法公式的时候,我很庆幸自己学的是计算机而不是数学😭。

      I Love Computer Since!

我爱计算机💗

8、下面这个RestClient查询指的是在IDEA中调用API

⭐️9、底层源码分析:

        我们说“大类+点”只能调用方法,不能调用变量,为什么下面这个总感觉有问题。

底层原理是类可以“返回类本身(其实不是类,而是对象)”。并且这个大类通过连续调用自己,最终只返回了一个对象,且只返回了一个对象,也不是返回的类!这点很重要!因此为什么要获取这个类的时候我们要用"大类.Class"

下面这个类调用的不是方法,返回的也不是类本身的对象。这个类调用的是静态的一个变量。

10、复合查询是:包含多个叶子查询

11、下面这个什么意思?是只继承了这个Ixxx接口的唯一一个接口Rxxx

12、这个类是干了个啥事?

 它的底层代码是这样的:

这里的String...意思是可以传入0个、1个或多个字符串。这里如果传入多个字符串的话,这些字符串最终构成了一个String[]数组。并且创建一个SearchSoueceBuilder()   防御性编程。保证每个 SearchRequest 对象被创建后,始终有一个可用的 SearchSourceBuilder,避免后续调用 request.source() 时出现 NullPointerException

13、很重要的代码:   斜杠后面的话很重要//

    @Test
    void testBool() throws IOException {
        // 1.创建Request,是为了最后执行这个request
        SearchRequest request = new SearchRequest("items");

        BoolQueryBuilder bool = QueryBuilders.boolQuery();

        bool.must(QueryBuilders.matchQuery("name", "脱脂牛奶"));

        bool.filter(QueryBuilders.termQuery("brand", "德亚"));

        bool.filter(QueryBuilders.rangeQuery("price").lte(30000));//把price、30000分别通过rangeQuery、lte这两个方法赋值给了一个QueryBuilders对象,然后又通过BoolQueryBuilder的must方法、filter方法传入了一个只装QueryBuilders的List集合!很重要是集合!
        request.source().query(bool);//这个source没有传入值,query传入了bool这个值,两个方法同时调用,所以最终返回的一定是个对象,而没有查询。

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);//构建了一个SearchResponse对象

        handleResponse(response);//handleResponse执行了response这个对象,实现了搜索。
    }


网站公告

今日签到

点亮在社区的每一天
去签到