【高并发系列】25、并行搜索

Slater开源搜索引擎更新:支持BM25全文索引与Graphiti查询 全文检索是信息检索领域的核心技术,它通过建立倒排索引,将文档内容转换为可快速查询的数据结构。其核心原理在于对文本进行分词、索引和相关性排序,从而在海量数据中精准定位信息。这项技术的价值在于为应用提供了高效、准确的信息查找能力,极大地提升了用户体验和数据利用率。在工程实践中,轻量级、可嵌入的本地搜索引擎库成为许多开发者的首选,它们能在不依赖Elasticsearch等重型服务的情况下,为桌面应用、中小型网站或内部系统快速集成搜索功能。Slater作为一款用Rust编写的嵌入式搜索引擎,近期通过引入经典的BM2 阅读详情

简单的策略实现并行搜索:

将原始数据集合按照期望的线程数量分割;每个线程各自独立搜索,当其中有一个线程找到数据后,立即返回结果即可;

/**
 * 并行搜索
 * 
 * @author daniel
 */
public class ParallelSearch {
	// 整型数组,保存需要查找的元素
	static int[] arr;
	// 线程池
	static ExecutorService pool = Executors.newCachedThreadPool();
	// 线程数量
	static final int Thread_num = 2;
	// 结果,默认-1表示未找到
	static AtomicInteger result = new AtomicInteger(-1);
	/**
	 * 每个线程实际执行的搜索方法
	 * 
	 * @param searchValue
	 *            要查找的数据
	 * @param beginPos
	 *            开始位置
	 * @param endPos
	 *            结束位置
	 * @return 查找数据所在位置或未找到-1
	 */
	public static int search(int searchValue, int beginPos, int endPos) {
		int i = 0;
		for (i = beginPos; i < endPos; i++) {
			// 其他线程已经找到查找的数据
			if (result.get() >= 0) {
				return result.get();
			}
			// 本线程找到查找的数据
			if (arr[i] == searchValue) {
				// 设置失败表示其他线程已经找到
				if (!result.compareAndSet(-1, i)) {
					return result.get();
				}
				return i;
			}
		}
		return -1;
	}
	/**
	 * 查找任务类
	 * 
	 * @author daniel
	 */
	public static class SearchTask implements Callable<Integer> {
		int begin, end, searchValue;
		public SearchTask(int searchValue, int begin, int end) {
			this.searchValue = searchValue;
			this.begin = begin;
			this.end = end;
		}
		@Override
		public Integer call() throws Exception {
			int re = search(searchValue, begin, end);
			return re;
		}
	}
	/**
	 * 封装的查找方法
	 * 
	 * @param searchValue
	 *            要查找的数据
	 * @return 查找数据所在位置或未找到-1
	 * @throws InterruptedException
	 * @throws ExecutionException
	 */
	public static int pSearch(int searchValue) throws InterruptedException, ExecutionException {
		int subArrSize = arr.length / Thread_num + 1;
		List<Future<Integer>> re = new ArrayList<>();
		for (int i = 0; i < arr.length; i += subArrSize) {
			int end = i + subArrSize;
			if (end >= arr.length) {
				end = arr.length;
			}
			re.add(pool.submit(new SearchTask(searchValue, i, end)));
		}
		for (Future<Integer> fu : re) {
			if (fu.get() >= 0) {
				return fu.get();
			}
		}
		return -1;
	}
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		arr = new int[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
		System.out.println(pSearch(4));
		pool.shutdown();
	}
}

 

Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(十九):微服务实战——Boot 4 + Spring Cloud 2026.x,构建高并发电商分布式系统 Component@Slf4j@Autowired// 白名单路径@Override// 白名单放行// 提取Token// 传递用户信息到下游服务.mutate().build();@Override// 最高优先级if (bearer!@Component技术点Boot 3 时代Boot 4 时代提升线程模型平台线程池(200线程上限)虚拟线程(百万级并发)50x+服务通信。 阅读详情

相关推荐

高并发搜索系统设计

58同城的搜索系统设计,一篇很好的文档。

并行设计模式:并行流水线与并行查找

流水线与指令重排 我们知道进程切换开销是很大的,CPU首先保存当前被中断进程现场,然后把系统堆栈指针保存到PCB中,接着去处理中断,选择下一个占用CPU的进程。引入线程的目的就是减少了系统的时空开销,因为现在多核处理器已经十分普遍,设想如果一个程序它只有一个线程,那么在一个双核处理器上运行该程序,那么同一时刻只有一个核在运行,另一个核就处于空闲状态,导致系统资源浪费。程序使用多线程,可以充分利用...

大力海棠的博客 3294

亿级数据的高并发通用搜索引擎架构设计[转载]

NULL 博文链接:https://xiangxingchina.iteye.com/blog/932216

C/C++ 并行搜索 算法

使用多线程,将一组数据拆分成多组进行查询,提高查询效率!

cpp_learner的博客 1327

亿级数据的高并发通用搜索引擎架构设计 国内高手设计

前公司的分类信息搜索基于此架构,效果明显,甚至将很大一部分带Where条件的MySQL SQL查询,都改用了Sphinx+MySQL搜索。但是,这套架构仍存在局限:一是MySQL本身的并发能力有限,在200~300个并发连接下,查询和更新就比较慢了;二是由于MySQL表的主键与Sphinx索引的ID一一对应,从而无法跨多表建立整站查询,而且新增加类别还得修改配置文件,比较麻烦;三是因为和MySQL集成,无法发挥出Sphinx的优势。

重访时间与覆盖分析的stk操作

1.打开stk 2.创建一个新的场景,命名为Test,选择地球为场景星球,若为金星,可在Central Body里选择Venus(金星自转周期慢,自转周期243天,卫星轨道变化不明显)(其中start stop时间可设置长一些) 3.插入一个AreaTarget或者place,以AreaTarget为例 选择Pattern,Add三个点(用法可见前面的博客,有时候编程的代码也可以帮助理解stk的操作) 4.插入Satellite,选择Orbit Wizard(若想设置卫星的六根数也可

weixin_42664107的博客 1万+

百亿数据存储-高并发搜索如何设计?

前几天,有位同学去字节面试,就碰到了这个问题: “百亿级数据存储,你怎么设计?” 他们回答说要分库分表,但面试官好像不太满意。那到底为啥呢?

程序员江小北 1840

从2D到3D地图开发:手把手教你用Cesium+Three.js实现卫星轨迹可视化(含代码片段)

本文详细介绍了如何结合Cesium与Three.js实现从2D到3D的卫星轨迹可视化。通过对比传统Web GIS框架的局限,阐述了Cesium处理三维地理与轨道数据、Three.js负责高级图形渲染的分工优势,并提供了从环境搭建、坐标同步到动态粒子效果实现的完整代码实战指南。

nut55的博客 673

并行搜索

文章目录1 并行搜索1.1 并发的基本概念1.2 并行搜索 1 并行搜索 1.1 并发的基本概念 所谓并发是在同一实体上的多个事件同时发生。并发编程是指在在同一台计算机上“同时”处理多个任务。 要理解并发编程,我们必须要理解如下一些基本概念: 计算机就像一座工厂,时刻在运行,为人类服务。它的核心是 CPU,它承担了所有的计算任务,就像工厂的一个现场指挥官。 进程就像工厂里的车间,承担“工厂”里的各项具体的“生产任务”,通常每个进程对应一个在运行中的执行程序,比如,QQ 和微信运行的时候,他们分别是不同的进

木子皿--啥都不会的菜鸟 839

基于Matlab与Bladed联合仿真的交互软件设计

基于Matlab与Bladed的交互软件设计

weixin_45014222的博客 816

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

如何快速实现高并发短文检索

一、需求缘起某并发量很大,数据量适中的业务线需要实现一个“标题检索”的功能:(1)并发量较大,每秒20w次(2)数据量适中,大概200w数据(3)是否需要分词:是(4)数...

shenjian58的博客 578

学习笔记--在线强化学习、离线强化学习、连续强化学习的区别(4)

在连续强化学习中,状态和动作都是连续的,这意味着智能体可以采取无限数量的动作,并且状态空间是连续的,而不是离散的点。- 策略评估和模型选择:在离线学习中,如何有效地评估不同策略和模型的性能,是一个重要的研究问题。- 连续学习和迁移学习:在线学习中,学习者需要不断在不同任务和环境中学习,研究者致力于研究如何将之前学到的知识迁移到新任务中,以实现更高效的学习和决策。- 连续动作选择和优化:在连续动作空间中,智能体对动作的选择是无限的,研究者在连续强化学习中通常关注如何有效地选择连续动作,以达到最优决策策略。

hzlalb的博客 3602

Java面试-如何设计一个搜索引擎?倒排索引、分词

《Java面试指南:搜索引擎核心技术解析》摘要 本文系统讲解了搜索引擎设计原理与Java实现,重点剖析了: 核心架构:倒排索引机制(对比正排索引)及Java代码实现 中文分词难点:最大匹配/CRF/BERT等算法原理 排序策略:TF-IDF、BM25等经典算法 系统优化:高并发架构设计与Lucene/ES选型对比 实战演示:SpringBoot整合Lucene实现简易搜索引擎 涵盖从底层数据结构到分布式架构的全链路设计,附完整代码示例和面试高频考点,帮助开发者深入理解搜索引擎技术本质。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

ThinkAdmin后台Getshell

通过文件包含或者图片马的方式Getshell。修改其可允许的文件类型,php不允许,可添加。系统管理->系统参数配置->本地服务器存储。

hot_milk1的博客 1867

[Research Tips] 我的zotero文献管理方案: 云端同步+iPad批注+overleaf笔记

文献管理一直是一个很头疼的事. 最初直接在paper上做笔记, 后来尝试各种各样的文献管理软件, 比如endnote, mendeley等, 再后来直接用excel. 每一种方案都不是很满意. 最近尝试了各种软件, 摸索出一个合适自己的文献管理方案, 分享给大家. 我的需求: 支持PDF内全文搜索. 支持笔记搜索. 支持同步 可以批注PDF. 支持word内引用 支持Tex笔记语法 支持标签化管理 目前的方案除了第二个需求, 其他的都支持. 就目前我的经验来说, 除了知网研学可以搜索笔记外, 其他软件都

落日之城 5318

asp.net解决高并发的方案

最近几天一直在读代震军的博客,他是Discuz!NT的设计者,读了他的一系列关于Discuz!NT的架构设计文章,大呼过瘾,特别是Discuz!NT在解决高访问高并发时所设计的一系列方案,本人尤其感兴趣。写这篇文章的目的,算是对初次阅读之后的总结备忘吧,以便以后有时间亲自测试,如果能在生产环境中得到应用,那就更有参考价值了。 测试方法: 本地模拟测试网站高访问高并发采用的测试工具是大名鼎鼎的Loa...

leefang_cvic的博客 959

【OpenClaw从入门到精通】第26篇:从0到1构建OpenClaw二次发行版——企业专属AI平台实战指南(2026实测)

本文基于OpenClaw 2026.3.7开源内核,聚焦企业级AI平台的二次发行构建,从技术原理、实操流程到商业落地提供完整方法论。核心围绕“内核层-能力层-产品层”三层架构,详解源码编译、私有化部署、企业级特性开发(数据合规、国产化适配、业务系统集成)、产品化包装等关键步骤,并通过审计行业“智审助手”虚拟实战案例具象化落地路径。文章兼顾新手入门与进阶提升,提供可直接复用的代码、配置文件及执行结果,解决企业对AI Agent“开箱即用”“数据不出域”“业务适配”的核心诉求,助力开发者快速打造企业专属AI平台

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 716

25年Java开发面试题,背完通过率(95%)

于是开始找场景题的资源,功夫不负有心人,在github上获取到了新版的,刷题比八股确实好多了,下旬的面试也基本都遇到了,目前已入职一家400多人的公司,氛围很好,领导对我也很关爱,同事对我也很照应。这里强调一下,不是我变强了,是企业真要人的时候,但是遇到大多都是拷打场景题和结合项目进行提问的,难度不是很高,就是一开始本人刷的是八股,场景题并没有很深的研究,月初到月中的面试基本都挂掉了。除此之外,最近秋招,面试的话不知道框架类的面试会不会有需求,索性都放了进去,包括个人的简历写法等等!重平衡的过程是怎么样?

WYiQIU的博客 930

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HY-MT1.5-7B部署进阶:多GPU并行推理配置

HY-MT1.5-7B支持术语干预功能,可通过prompt engineering或微调实现。prompt = "你是一个专业翻译引擎,请根据以下术语表进行精准翻译:\n"prompt += f"\n请翻译以下内容,保持原有格式:\n{source_text}"# 示例术语表"WeChat": "微信","Tencent Cloud": "腾讯云","Shenzhen": "深圳"# 输出:"在深圳使用腾讯云和微信非常方便。本文系统介绍了HY-MT1.5-7B在多GPU环境下的并行推理部署方案。

weixin_35045970的博客 726

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

rag稀疏检索召回bm实践

在rag项目中, BM25 是常用的文本稀疏检索模型,它基于词频信息,计算查询和文档之间的相似性,以下介绍bm25算法的相关实践。相比于TF-IDF,bm25能够更好地处理词频的饱和效应和文档长度的影响,特别是在大规模文档集合和实际应用中,因此被广泛应用于信息检索系统中,常见的检索组件solr和elasticsearch均基于bm25算法。

sinat_28694519的博客 1323

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL全文搜索引擎 mysqlcft

MySQL在高并发连接、数据库记录数较多的情况下,SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不仅效率差,而且以通配符%开头作查询时,使用不到索引,需要全表扫描,对数据库的压力也很大。MySQL针对这一问题提供 了一种全文索引解决方案,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,至今为 止,MySQ...

soledede 344

开发者狂喜!Gemini 3.1 Flash-Lite今日上线:高并发场景下,我实测后直接把竞品API全换了!

**摘要:**谷歌DeepMind发布Gemini 3.1 Flash-Lite预览版,专为高并发、低延迟场景优化。实测显示其输出速度达363 tokens/秒,成本比竞品低30%-70%,支持多模态和1M上下文。在代码生成、翻译、数据提取等场景表现优异,综合性价比远超Gemini 2.5 Flash和Claude Haiku等竞品。开发者可通过Google AI Studio或Vertex AI快速接入,亚洲用户还可通过聚合平台获得加速服务。该模型标志着AI进入注重落地成本的新阶段。(149字)

Maynor的博客 1627

java高并发

找工作的时候是否经常看到要求有高并发,分布式系统的开发设计经验,或者高并发,分布式系统的开发设计经验者优先等字样,这时候情不自禁的搜索一下什 么是并发,多少算高并发,再思索一下自己的经历哪些是符合这个要求的?那么什么是并发,开发中的并发是怎么处理的,简单了解一下吧。         在介绍并发之前我们先了解一下串行和并行:         热闹的景点,买票人很多,这时只有一个窗口售票,

u012551686的博客 203

阿里云Elasticsearch AI搜索实践

本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。

科技很有意思 1883
上一篇: 【Spark学习笔记】5、Java版-算子系列之mapPartitions(f:Iterator[T] => Iterator[U]) : RDD[T] => RDD[U]
下一篇: 【高并发系列】26、并行排序
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值