控制台搜索引擎用Scanner读取关键词,HashMap构建倒排索引,支持AND/OR查询解析,输出限10条并高亮关键词。

用 Scanner 读取用户输入的搜索关键词
控制台搜索引擎第一步是接收用户输入,Scanner 是最直接的选择。注意别用 nextLine() 后紧接 nextInt() 这类组合——容易因换行符残留导致跳过输入。实际项目中建议统一用 nextLine(),再手动解析数字或 trim 空格。
- 输入前加提示:比如
System.out.print("请输入关键词:"); - 对空输入做判断:
if (keyword.trim().isEmpty()) { ... },避免后续空指针或无效匹配 - 若支持多词搜索,用
keyword.split("\\s+")拆分,注意正则里双反斜杠是 Java 字符串转义必需
用 HashMap> 做简易倒排索引
不用数据库、不引入 Lucene,靠内存集合模拟搜索引擎核心结构,HashMap 存关键词到文档 ID 列表的映射是最小可行方案。键是标准化后的词(全小写、去标点),值是包含该词的文档标识(比如文件名或序号)。
- 预处理文档时,对每篇文本调用
toLowerCase().replaceAll("[^a-z0-9\\s]", "")再分词,保证索引一致性 - 避免用
ArrayList存重复文档 ID;插入前用!list.contains(docId)去重,或改用LinkedHashSet - 如果文档量超 500 条,
contains线性查找会明显变慢,此时应换为HashSet存文档 ID,再转回List返回
实现“AND”与“OR”逻辑的查询解析器
用户输入 "java AND spring" 或 "python OR rust" 时,不能靠 String.contains() 硬匹配——得先识别操作符,再拆解条件。简单做法是按空格切分后扫描关键词,遇到 "AND" 或 "OR" 就切换合并策略。
-
"AND"对应交集:用ret.retainAll(nextList),初始ret设为第一个词的结果 -
"OR"对应并集:用ret.addAll(nextList),记得用new LinkedHashSet(ret)去重 - 大小写敏感问题:确保所有操作符判断都用
equalsIgnoreCase(),比如"and".equalsIgnoreCase(token) - 不支持括号嵌套,也不处理
NOT;真要加NOT,就用removeAll(),但得小心空集合导致全删
输出结果时控制展示格式与数量
直接打印 List 的 toString() 会暴露内部结构,难读。应该封装成带编号、高亮关键词、限制条数的输出。
立即学习“Java免费学习笔记(深入)”;
- 用
Math.min(results.size(), 10)限制最多显示 10 条,避免刷屏 - 高亮关键词:对每条文档内容做
content.replace(keyword, "" + keyword + "")—— 控制台不支持 HTML,所以实际用"[" + keyword + "]"包裹更稳妥 - 编号从 1 开始:循环里用
i + 1,别用for (int i : results)这种丢失序号的方式 - 没结果时明确提示
"未找到匹配文档",而不是静默退出
equals 判断。这些细节在小数据上没问题,一加测试文档就崩。










