`

搜索引擎工具类

阅读更多
/**
 * 搜索引擎工具类
 * @author ruanzhiyong6496
 * @version 1.0
 */
public class Lucene
{
	private static String INDEX_DIR = "D:\\index";// 索引存放目录
	private static String DATA_DIR = "D:\\small";// 小文件存放的目录

	/**
	 * 将大文件切割为小文件
	 * 
	 * @param filepath
	 *            大文件路径
	 * @param outputdir
	 *            小文件輸出目錄
	 * @param size
	 *            小文件尺寸
	 */
	private static void splitToSmallFiles(String filepath)
	{
		int filePointer = 0;
		int MAX_SIZE = 1024 * 10;
		BufferedWriter writer = null;
		int index1 = filepath.lastIndexOf("/");
		int index2 = filepath.lastIndexOf(".");
		String fileName = filepath.substring(index1 + 1, index2);
		try
		{
			File dir = new File(DATA_DIR);
			if (!dir.exists())
			{
				dir.mkdir();
			}
			BufferedReader reader = new BufferedReader(new FileReader(filepath));
			StringBuffer buffer = new StringBuffer();
			String line = reader.readLine();
			while (line != null)
			{
				buffer.append(line).append("\r\n");
				if (buffer.toString().getBytes().length >= MAX_SIZE)
				{
					File file = new File(dir, fileName + filePointer + ".txt");
					writer = new BufferedWriter(new FileWriter(file));
					writer.write(buffer.toString());
					writer.close();
					filePointer++;
					buffer = new StringBuffer();
				}
				line = reader.readLine();
			}
			System.out.println("The file hava splited to small files !");
		}
		catch (FileNotFoundException e)
		{
			System.out.println("file not found !");
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * 索引dataDir下的.txt文件,并储存在indexDir下,返回索引的文件数量
	 * 
	 * @param indexDir
	 * @param dataDir
	 * @return int
	 * @throws IOException
	 */
	private static int index() throws IOException
	{

		File dataDr = new File(DATA_DIR);
		if (!dataDr.exists() || !dataDr.isDirectory())
		{
			throw new IOException(dataDr
					+ " does not exist or is not a directory");
		}

		IndexWriter writer = new IndexWriter(FSDirectory.open(new File(
				INDEX_DIR)), new StandardAnalyzer(Version.LUCENE_CURRENT),
				true, IndexWriter.MaxFieldLength.LIMITED);// 有变化的地方

		indexDirectory(writer, DATA_DIR);
		int numIndexed = writer.numDocs();
		writer.optimize();
		writer.close();
		return numIndexed;
	}

	/**
	 * 循环遍历目录下的所有.txt文件并进行索引
	 * 
	 * @param writer
	 * @param dir
	 * @throws IOException
	 */
	private static void indexDirectory(IndexWriter writer, String dir)
			throws IOException
	{

		File dr = new File(dir);
		if (!dr.exists())
		{
			return;
		}
		File[] files = dr.listFiles();
		for (int i = 0; i < files.length; i++)
		{
			File f = files[i];
			if (f.isDirectory())
			{
				indexDirectory(writer, f.getName()); // recurse
			}
			else if (f.getName().endsWith(".txt"))
			{
				indexFile(writer, f);
			}
		}
	}

	/**
	 * 对单个txt文件进行索引
	 * 
	 * @param writer
	 * @param f
	 * @throws IOException
	 */
	private static void indexFile(IndexWriter writer, File f)
			throws IOException
	{

		if (f.isHidden() || !f.exists() || !f.canRead())
		{
			return;
		}

		// System.out.println("Indexing " + f.getCanonicalPath());
		Document doc = new Document();
		doc.add(new Field("contents", new FileReader(f)));// 有变化的地方
		doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES,
				Field.Index.ANALYZED));// 有变化的地方

		writer.addDocument(doc);
	}

	/**
	 * 查询
	 * 
	 * @param indexDir
	 * @param q
	 * @throws Exception
	 */
	public static void search(String filepath, String keyword, int topnum)
	{

		try
		{
			splitToSmallFiles(filepath);
			index();
			IndexSearcher is = new IndexSearcher(FSDirectory.open(new File(
					INDEX_DIR)), true);// read-only
			String field = "contents";

			QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,
					new StandardAnalyzer(Version.LUCENE_CURRENT));// 有变化的地方
			Query query = parser.parse(keyword);

			TopScoreDocCollector collector = TopScoreDocCollector.create(
					topnum, false);// 有变化的地方

			long start = new Date().getTime();// start time

			is.search(query, collector);
			ScoreDoc[] hits = collector.topDocs().scoreDocs;

			// System.out.println(hits.length);
			for (int i = 0; i < hits.length; i++)
			{
				Document doc = is.doc(hits[i].doc);// new method is.doc()
				System.out.println(doc.getField("filename"));
				// System.out.println(doc.getField("filename") + " "
				// + hits[i].toString() + " ");
			}
			long end = new Date().getTime();// end time

			System.out.println("Found " + collector.getTotalHits()
					+ " document(s) (in " + (end - start)
					+ " milliseconds) that matched query '" + keyword + "':");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

}

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    360安全浏览器

    360浏览器官方版是中国使用人数最多的浏览器,也是最注重安全的浏览器。360浏览器官方版的无痕浏览功能可以让用户在浏览网页时不留下访问痕迹,这样别人就不能在你走后窥探隐私,隔离模式会在360浏览器中建立沙盒,...

    搜索引擎关键字排名查询工具

    1. 多搜索引擎支持:这类工具能够同时检查网站在Google、百度、Bing、Yahoo等主流搜索引擎上的关键字排名,为用户提供全面的数据分析。 2. 关键词管理:用户可以批量导入或添加关键词,对不同关键字的排名进行跟踪...

    我封装的搜索引擎之lucene篇

    2. **搜索工具封装**:可能包含一个自定义的搜索引擎工具类,简化了Lucene的调用过程,便于集成到其他项目中。 3. **配置管理**:"search.xml"可能涉及到的配置项,如索引目录、分析器配置、搜索结果分页设置等。 4....

    综合搜索引擎与垂直搜索引擎的比较研究

    综合搜索引擎与垂直搜索引擎作为互联网信息服务的两大主要工具,正日益成为人们检索和获取信息的重要途径。在本文中,我们将探讨两者在信息服务模式上的差异,以及它们之间的竞争与合作关系,并展望垂直搜索引擎未来...

    搜索引擎批量收录查询工具

    标题中的"搜索引擎批量收录查询工具"是一个专门针对这一需求设计的软件,它能够帮助用户快速、高效地获取大量域名的收录信息。 描述中提到的"批量查询域名的收录数"是指该工具能够同时处理多个域名,一次性查询它们...

    搜索引擎优化-搜索引擎的分类.pptx

    元搜索引擎则是一种整合多个全文搜索引擎结果的工具,如Dogpile和MetaCrawler。它们并不直接存储网页信息,而是同时向多个搜索引擎发送查询请求,然后将合并后的结果展示给用户。这样做的好处是可以得到更全面的搜索...

    Elasticsearch工具类

    Elasticsearch工具类是开发中常见的一种抽象封装,旨在简化与Elasticsearch数据库的交互,提高代码的可读性和可维护性。Elasticsearch是一种基于Lucene的分布式、RESTful搜索和分析引擎,广泛用于实时大数据分析和...

    搜索引擎基本工作原理.pdf

    搜索引擎是互联网上获取信息的关键工具,其基本工作原理主要包括三个主要步骤:抓取网页、处理网页和提供检索服务。搜索引擎的爬虫程序(Spider)通过网络中的超链接不断抓取网页,形成网页快照。抓取过程中,搜索...

    搜索引擎开发工具包--lucene

    这个搜索引擎开发工具包为开发者提供了一整套高效、稳定的文本搜索功能,使得构建自己的搜索引擎变得简单易行。通过使用Lucene,我们可以避免从零开始实现复杂的索引算法和数据结构,从而节省大量时间和精力。 首先...

    基于Lucene的中型搜索引擎(C#)

    **基于Lucene的中型搜索引擎(C#)** 在IT领域,搜索引擎是不可或缺的一部分,它们能够高效地处理海量数据,帮助用户快速找到所需信息。本文将深入探讨一个基于Apache Lucene的中型搜索引擎实现,该实现是由...

    大数据时代背景下的搜索引擎解决方案-大数据搜索引擎原理分析及实现

    大数据时代背景下的搜索引擎解决方案/大数据搜索引擎原理分析及实现 内 容 简 介 大数据时代背景下的搜索引擎解决...析的主流工具,在搜索引擎中构建知识图谱,以 及进行日志反馈学习机制,使得搜索引擎 更加智能。

    最全的国外搜索引擎提交入口

    ### 最全的国外搜索引擎提交入口...最后,虽然自动化工具可以提高效率,但在选择使用前,请务必确保了解工具的工作原理以及是否符合目标搜索引擎的政策。合理的策略和细心的操作将有助于外贸网站在国际市场上取得成功。

    本地文件搜索引擎(类XP搜索引擎)

    本地文件搜索引擎是一款应用程序,它的设计目标是模仿XP操作系统中的本地文件搜索功能,让用户能快速、高效地在自己的计算机上查找所需的文件。这个程序的核心技术涵盖了多个方面,包括GUI(图形用户界面)设计、...

    主流搜索引擎简介PPT

    1. **全文搜索引擎**:这类搜索引擎会直接搜索其自身建立的网页数据库,提供全面的关键词搜索,如Google和百度。它们的优点是搜索结果全面,可以使用布尔运算符和短语搜索,但缺点是可能会返回大量不精确的结果。 2...

    搜索引擎 工作原理

    搜索引擎作为互联网时代不可或缺的工具之一,在信息获取过程中扮演着重要角色。本文旨在介绍搜索引擎的基本概念,深入探讨其工作原理及类型,并分析当前搜索引擎的发展现状与未来趋势。此外,还将简要介绍主流的中文...

    各大搜索引擎的关键词排名查询工具--源码

    1. **功能**:这类工具能帮助SEO专业人员或网站所有者了解他们的网站在特定关键词下的搜索引擎表现,以便调整策略。 2. **批量查询**:工具支持批量查询意味着可以一次性检查多个关键词在多个搜索引擎的排名,大大...

    基于ASP搜索引擎系统++论文

    作为一种重要的信息资源组织与控制工具,搜索引擎已成为人们上网必不可少的工具,并逐渐改变着人们的生活。 本文简述了搜索引擎定义及搜索引擎的发展史。着重阐述了搜索引擎的工作原理,指出了搜索引擎体系结构的四大...

    Elasticsearch java工具类

    在IT行业中,Elasticsearch是一个极其重要的开源搜索引擎,尤其在大数据和实时分析领域广泛应用。它基于Lucene构建,提供了一个分布式、全文检索、实时的搜索和分析引擎。本项目是针对Elasticsearch 5.x版本的Java...

Global site tag (gtag.js) - Google Analytics