6.26_JAVA_微服务_Elasticsearch
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.创建RequestBulkRequest request = new BulkRequest("items");// 2.准备参数,添加多个新增的Requestfor (Item item : items) {// 2.1.转换为文档类型ItemDTOItemDoc 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、很重要的代码: 斜杠后面的话很重要//
@Testvoid testBool() throws IOException {// 1.创建Request,是为了最后执行这个requestSearchRequest 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这个对象,实现了搜索。}