soap-search读取优化

soap-search地址

往期回顾

文件读取优化

面临问题

  • 1.文件会很大,因为文件会一直增加的,这里就需要解决的问题是存储压缩问题。
  • 1.1(目前这里soap-search的demo基本没采用什么压缩办法,只是最基本的把文件写入和解析出来;额外的处理就是对词频的位置记录采用了差值规则,数据长度采用Lucene里面的Vint类型)
  • 2.倒排的文件加载速度也要尽可能提升,不然影响搜索的响应体验不好
  • 2.1今天分享下对文件读取采用的小技巧
  • 2.2为什么这里很重要因为词频的数据量很大(因为我这里做了跟域的关联可能导致进一步的加大)
  • 3.对于文件的结构需要设计合理的组织和关联,这对于文件的读写也产生了要求,因为结构复杂了那么实现的难度就变大了。
  • 3.1.基本只是把关系简单的搞下,能跑通demo的状况(下面这个图之前画的上次不知道为什么没加载上去-_-

读取的优化

  • 1.词频本来是个单独文件,(优化的时候借鉴了文档与域的关联关系,我也添加了个文件记录了下词频的位置,为后面多线程解析作下准备)
  • 2.首先是文件的加载,之前是一点一点数据结构的读取。
  • 2.1我这里首先采用了极端的方法一次性先把文件都加载上来进来,然后再解析。(这样文件的读取解析有很大的提升了,但是会消耗点内存)
  • 2.2这里我也做了个折中的处理先指定特定的长度去加载文件(因为我们记录的有词频的位置,这样加载的长度是可以计算出来的,再加上初始的偏移量我们就可以准确的先加载内容再去处理数据了,这样解析的提取的内容也不会出错)
  • 2.3这样处理后效果很明显。
java 复制代码
  public void readAllFile() throws IOException {
        long startTime = System.currentTimeMillis(); // 记录开始时间
        long position = 0;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        while (position < fileLength) {
            // 对齐到页边界
            long alignedPos = alignToPage(position);
            // 读取一页大小数据;这里默认读取了4个页内容
            ByteBuffer buffer = ByteBuffer.allocate(IndexReaderPage.BUFFER_SIZE);
            raf.getChannel().position(alignedPos);
            int bytesRead = raf.getChannel().read(buffer);

            // 处理 buffer 数据...
            if (bytesRead > 0) {
                buffer.flip();
                position+=buffer.remaining();
                appendBuffer(baos, buffer);
               // Log.info("读取位置:{},实际读取字节数:{}",alignedPos, bytesRead);
            }
            position = alignedPos + IndexReaderPage.BUFFER_SIZE; // 移动到下一页
        }
        currentBuffer=baos.toByteArray();
        Log.info("===文件提取耗时:{}ms",(System.currentTimeMillis()-startTime)); // 记录开始时间);
    }

    private static void appendBuffer(ByteArrayOutputStream output, ByteBuffer buffer) {
        byte[] array = new byte[buffer.remaining()];
        buffer.get(array);
        output.write(array, 0, array.length);
    }
    private static long alignToPage(long offset) {
        return (offset / IndexReaderPage.BUFFER_SIZE) * IndexReaderPage.BUFFER_SIZE;
    }

最后测试的效果吧

测试数据是部分文档重复写入,词频已经达到百万了

txt 复制代码
2025-06-01 12:49:30,383 [main] INFO  INFO  c.s.s.s.DocumentReader:28 - 线程池初始化预热...
2025-06-01 12:49:30,393 [main] INFO  INFO  c.s.s.s.DocumentReader:120 - 词频开始提取...
2025-06-01 12:49:30,414 [main] INFO  INFO  c.s.s.s.IndexReaderPage:104 - ===文件提取耗时:19ms
2025-06-01 12:49:30,417 [main] INFO  INFO  c.s.s.s.DocumentReader:133 - 词频个数:1141380
2025-06-01 12:49:30,484 [pool-3-thread-4] INFO  INFO  c.s.s.s.DocumentReader:191 - 线程 [pool-3-thread-4] 正在处理任务 #4
2025-06-01 12:49:30,484 [pool-3-thread-2] INFO  INFO  c.s.s.s.DocumentReader:191 - 线程 [pool-3-thread-2] 正在处理任务 #2
2025-06-01 12:49:30,484 [pool-3-thread-1] INFO  INFO  c.s.s.s.DocumentReader:191 - 线程 [pool-3-thread-1] 正在处理任务 #1
2025-06-01 12:49:30,484 [pool-3-thread-3] INFO  INFO  c.s.s.s.DocumentReader:191 - 线程 [pool-3-thread-3] 正在处理任务 #3
2025-06-01 12:49:30,486 [pool-3-thread-4] INFO  INFO  c.s.s.s.IndexReaderPage:104 - ===文件提取耗时:0ms
2025-06-01 12:49:30,489 [pool-3-thread-4] INFO  INFO  c.s.s.s.DocumentReader:221 - 线程 [pool-3-thread-4] 完成任务 #4
2025-06-01 12:49:30,506 [pool-3-thread-2] INFO  INFO  c.s.s.s.IndexReaderPage:104 - ===文件提取耗时:21ms
2025-06-01 12:49:30,508 [pool-3-thread-1] INFO  INFO  c.s.s.s.IndexReaderPage:104 - ===文件提取耗时:22ms
2025-06-01 12:49:30,508 [pool-3-thread-3] INFO  INFO  c.s.s.s.IndexReaderPage:104 - ===文件提取耗时:22ms
2025-06-01 12:49:33,884 [main] INFO  INFO  c.s.s.s.DocumentReader:169 - 词频提取结束...
2025-06-01 12:49:33,901 [main] INFO  INFO  c.s.s.s.DocumentReader:174 - ===词频提取耗时:3508ms
2025-06-01 12:49:34,152 [main] INFO  INFO  c.s.s.q.Search:56 - ===跳表加载耗时:3773ms
相关推荐
沙滩小岛小木屋2 分钟前
maven编译时跳过test过程
java·maven
江沉晚呤时1 小时前
SQL Server 事务详解:概念、特性、隔离级别与实践
java·数据库·oracle·c#·.netcore
GoGeekBaird1 小时前
69天探索操作系统-第66天:为现代操作系统设计高级实时进程间通信机制
后端·操作系统
还是鼠鼠2 小时前
单元测试-概述&入门
java·开发语言·后端·单元测试·log4j·maven
Elastic 中国社区官方博客3 小时前
Elastic 和 AWS 合作将 GenAI 引入 DevOps、安全和搜索领域
大数据·数据库·elasticsearch·搜索引擎·云计算·全文检索·aws
我最厉害。,。3 小时前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
MyikJ4 小时前
Java求职面试:从Spring到微服务的技术挑战
java·数据库·spring boot·spring cloud·微服务·orm·面试技巧
MyikJ4 小时前
Java 面试实录:从Spring到微服务的技术探讨
java·spring boot·微服务·kafka·spring security·grafana·prometheus
ShiinaMashirol4 小时前
代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )
java·图论
cui_hao_nan5 小时前
Nacos实战——动态 IP 黑名单过滤
java