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这个对象,实现了搜索。
}