ElasticSearch倒排索引、ES核心概念、JAVA集成ES操作

目录

一、倒排索引

IK分词器:

二、ES核心概念:

创建索引库:

文档操作:

批量处理:

三、JavaRestClient:

客户端初始化:

商品Mapping映射:

索引库操作:

JAVA中操作文档:

新增文档:

删除文档:

查询文档:

修改文档:

全量更新:

局部更新:

JAVA中操作文档小结:

批处理:


一、倒排索引

IK分词器:

接下来我们来安装一下IK分词器:

1.在虚拟机当中输入:docker volume ls查看数据卷,找到elasticsearch的插件:

2.根据插件名称查看内部路径信息:docker volume inspect es-plugins

3.将我们解压后的elasticsearch-analysis-ik-7.12.1文件夹放到该路径下:

最终重启(docker restart es)就可以啦

这里简单口述一下分词器的原理,实际上就是分词器当中有一个词典,词典包含了中文大部分的有意义的词句;当我们输入一串搜索内容时,分词器将这一串内容分成一个个符号,通过一个一个、两个两个、三个三个......的方式逐个遍历拼接,然后到词典当中查找,如果有该词,则放入结果集当中,没有则不管;但是随着时代发展,很多网络用词、新词逐渐出现,这样我们在词典当中是查不到这个词的,也就不会触发文档的返回;所以我们可以在config目录下的文件配置新词,而且还可以设置屏蔽词

二、ES核心概念:

创建索引库:

相当于是数据库当中创建表

ES默认不允许修改已有的映射,但是可以添加:

文档操作:

相当于是数据库当中操作数据

全量修改:先删除后新增

局部修改(增量修改)

批量处理:

三、JavaRestClient:

客户端初始化:

1.在item-service微服务当中引入依赖:(因为商品查找功能在该服务当中)

XML 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

2.到父工程当中指定ES版本:(由于SpringBoot当中内置了es但是版本不一致,所以需要另外配置)

XML 复制代码
  <properties>
      <elasticsearch.version>7.12.1</elasticsearch.version>
  </properties>

3.初始化RestHighLevelClient:

java 复制代码
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
        HttpHost.create("http://192.168.150.101:9200")
));

商品Mapping映射:

java 复制代码
PUT /items
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "price":{
        "type": "integer"
      },
      "image":{
        "type": "keyword",
        "index": false
      },
      "category":{
        "type": "keyword"
      },
      "brand":{
        "type": "keyword"
      },
      "sold":{
        "type": "integer"
      },
      "commentCount":{
        "type": "integer",
        "index": false
      },
      "isAD":{
        "type": "boolean"
      },
      "updateTime":{
        "type": "date"
      }
    }
  }
}

索引库操作:

JAVA中操作文档:

新增文档:

删除文档:

查询文档:

修改文档:

全量更新:
局部更新:

JAVA中操作文档小结:

批处理:

当我们要导入商品数据时,由于商品数量达到数十万,因此不可能一次性全部导入。建议采用循环遍历方式,每次导入1000条左右的数据。

item-serviceDocumentTest测试类中,编写单元测试:

java 复制代码
@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++;
    }
}
相关推荐
a程序小傲1 天前
蚂蚁Java面试被问:注解的工作原理及如何自定义注解
java·开发语言·python·面试
幽络源小助理1 天前
SpringBoot+Vue摄影师分享社区源码 – Java项目免费下载 | 幽络源
java·vue.js·spring boot
0和1的舞者1 天前
《软件测试分类指南:8 大维度 + 核心要点梳理》
java·软件测试·单元测试·测试·黑盒测试·白盒测试·测试分类
TAEHENGV1 天前
创建目标模块 Cordova 与 OpenHarmony 混合开发实战
android·java·开发语言
是一个Bug1 天前
如何阅读JDK源码?
java·开发语言
Ledison71 天前
Springboot 3.5.7 + Springcloud 2025 升级记录
java
没有bug.的程序员1 天前
熔断、降级、限流:高可用架构的三道防线
java·网络·jvm·微服务·架构·熔断·服务注册
派大鑫wink1 天前
【Day15】集合框架(三):Map 接口(HashMap 底层原理 + 实战)
java·开发语言
派大鑫wink1 天前
【Day14】集合框架(二):Set 接口(HashSet、TreeSet)去重与排序
java·开发语言
weixin_515069661 天前
BeanToMapUtil-对象转Map
java·工具类·java常用api