Java实现简单的搜索引擎

打印 上一主题 下一主题

主题 1604|帖子 1604|积分 4812

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、准备工作

在开始实现搜索引擎之前,必要准备以下工作:

  • 编译环境:必要在本地安装JDK环境,并配置好对应的环境变量。
  • Maven管理工具:Maven是一个Java项目管理工具,能够主动下载所需的依赖库,并管理项目的编译、测试、打包等过程。
  • Lucene搜索引擎库:Lucene是一种高效的文本搜索引擎库,它提供了全文检索、含糊搜索、分词等功能,是实现搜索引擎的核心组件。

二、创建项目

1. 引入Lucene库

  1. <dependency>
  2. <groupId>org.apache.lucene</groupId>
  3. <artifactId>lucene-core</artifactId>
  4. <version>8.8.2</version>
  5. </dependency>
复制代码
2. 添加引用

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.nio.file.Paths;
  4. import org.apache.lucene.analysis.Analyzer;
  5. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  6. import org.apache.lucene.document.Document;
  7. import org.apache.lucene.document.Field;
  8. import org.apache.lucene.document.StringField;
  9. import org.apache.lucene.document.TextField;
  10. import org.apache.lucene.index.DirectoryReader;
  11. import org.apache.lucene.index.IndexReader;
  12. import org.apache.lucene.index.IndexWriter;
  13. import org.apache.lucene.index.IndexWriterConfig;
  14. import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
  15. import org.apache.lucene.queryparser.classic.ParseException;
  16. import org.apache.lucene.queryparser.classic.QueryParser;
  17. import org.apache.lucene.search.IndexSearcher;
  18. import org.apache.lucene.search.ScoreDoc;
  19. import org.apache.lucene.search.TopDocs;
  20. import org.apache.lucene.store.Directory;
  21. import org.apache.lucene.store.FSDirectory;
复制代码

三、实现功能

1. 创建索引

将指定目录下的所有文件创建索引,其中文件名和内容会被添加到索引中。
  1. public static void createIndex(String indexDir, String dataDir) throws IOException {
  2.     Analyzer analyzer = new StandardAnalyzer(); // 创建分词器
  3.     Directory dir = FSDirectory.open(Paths.get(indexDir)); // 创建索引目录
  4.     IndexWriterConfig config = new IndexWriterConfig(analyzer); // 创建索引配置
  5.     IndexWriter writer = new IndexWriter(dir, config); // 创建索引写入器
  6.     File[] files = new File(dataDir).listFiles(); // 获取数据文件列表
  7.     for (File file : files) {
  8.         if (!file.isDirectory() && !file.isHidden() && file.exists() && file.canRead()) {
  9.             Document doc = new Document(); // 创建文档
  10.             doc.add(new StringField("filename", file.getName(), Field.Store.YES)); // 添加文件名字段
  11.             doc.add(new TextField("content", new String(Files.readAllBytes(file.toPath())), Field.Store.NO)); // 添加文件内容字段
  12.             writer.addDocument(doc); // 写入索引
  13.         }
  14.     }
  15.     writer.commit(); // 提交写入
  16.     writer.close(); // 关闭写入器
  17. }
复制代码
2. 搜索文件

该方法会执行搜索,并输出匹配的文件名。
  1. public static void search(String indexDir, String queryStr, int maxHits) throws IOException, ParseException {
  2.     Analyzer analyzer = new StandardAnalyzer(); // 创建分词器
  3.     Directory dir = FSDirectory.open(Paths.get(indexDir)); // 创建索引目录
  4.     IndexReader reader = DirectoryReader.open(dir); // 创建索引读取器
  5.     IndexSearcher searcher = new IndexSearcher(reader); // 创建索引搜索器
  6.     String[] fields = {"filename", "content"}; // 指定搜索字段
  7.     QueryParser parser = new MultiFieldQueryParser(fields, analyzer); // 创建多字段查询解析器
  8.     parser.setDefaultOperator(QueryParser.Operator.OR); // 指定搜索模式
  9.     TopDocs hits = searcher.search(parser.parse(queryStr), maxHits); // 执行搜索
  10.     System.out.println("Total hits: " + hits.totalHits.value); // 输出结果总数
  11.     for (ScoreDoc scoreDoc : hits.scoreDocs) {
  12.         Document doc = searcher.doc(scoreDoc.doc); // 获取匹配的文档
  13.         System.out.println("File name: " + doc.get("filename")); // 输出匹配的文件名
  14.     }
  15. }
复制代码
3. 示例阐明

以下是两条实现搜索引擎的示例阐明。
1. 搜索本地文件

假设我们必要搜索本地C盘下的所有txt文件,我们可以利用以下代码:
  1. String indexDir = "C:/luceneIndex"; // 索引目录
  2. String dataDir = "C:/data"; // 数据目录
  3. String queryStr = "lucene"; // 查询字符串
  4. int maxHits = 10; // 最大结果数量
  5. createIndex(indexDir, dataDir); // 创建索引
  6. search(indexDir, queryStr, maxHits); // 执行搜索
复制代码
2. 搜索网络数据

假设我们必要从某个网站中搜索所有包含关键字的链接,我们可以利用以下代码:
  1. String indexDir = "C:/luceneIndex"; // 索引目录
  2. String url = "http://example.com/search?q=lucene"; // 查询链接
  3. String queryStr = "example"; // 查询字符串
  4. int maxHits = 10; // 最大结果数量
  5. DocumentFetcher documentFetcher = new DocumentFetcher(url);
  6. String data = documentFetcher.getContent();
  7. createIndex(indexDir, data); // 创建索引
  8. search(indexDir, queryStr, maxHits); // 执行搜索
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表