`
zhoujiangzi
  • 浏览: 92723 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Lucene 初体验

阅读更多

     今天看了下Lucene的更新,已经到4.4.0的版本了,而且新的API变化也比较多,对于老版本的Lucene想要升级到最新的版本,不是简单的更新jar包就可以的。

    下面写了个简单的小例子。可以看一下

 

1.创建maven工程

    在eclipse里面创建个maven项目,一个简单的项目即可,下面是对于的pom.xml文件,需要将Lucene的jar包引入进来。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jacksoft</groupId>
  <artifactId>Lucene-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>
  	<lucene.version>4.4.0</lucene.version>
  </properties>
  
  <dependencies>
  	<dependency>
  		<groupId>org.apache.lucene</groupId>
  		<artifactId>lucene-core</artifactId>
  		<version>${lucene.version}</version>
  	</dependency>
	
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-analyzers-common</artifactId>
		<version>${lucene.version}</version>
	</dependency>
	
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-queryparser</artifactId>
		<version>${lucene.version}</version>
	</dependency>
            
            
            
  </dependencies>
  
</project>

   这里只是简单的添加依赖关系,下载好jar包之后,我在本地创建了3个txt文件,如下:

  

  

 准备工作就差不多了,下面就开始进行编码工作

 

2. 编码

    由于是多个文件的搜索,这里创建一个工具类来递归目录,找到这三个txt文件,我将这三个txt文件放在本地:D:\lucene\luceneData目录中

   

package com.jacksoft.lucene.util;

import java.io.File;
import java.util.List;

public class FileUtils {

	public static void listFile(File f,List<String> fileList){
		if(f.isDirectory()){
			File[] files = f.listFiles();
			for(int i=0;i<files.length ;i++)
			{
				listFile(files[i],fileList) ;
			}
		}else{
			fileList.add(f.getAbsolutePath());
		}
	}
}

    这样返回的fileList中就包含了我们需要的txt文件,当然这里还可以设置过滤器来指定后缀名。

  接下来就是创建索引和查询的过程:

package com.jacksoft.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.jacksoft.lucene.util.FileUtils;

/**
 *  多文件搜索
 * @Project Lucene-test
 *
 * @Filename MultLuceneTest2.java
 *
 * @author Jack.Zhou
 *
 * @Date 2013-8-29
 *
 */
public class LuceneTest {

	private static final String QUERY_STR = "四川";
	
	private static final String FILE_TARGET = "D:\\lucene\\luceneData";
	
	private static final String FILE_INDEX = "D:\\lucene\\luceneIndex";
	
	
	public static void main(String[] args) {
		try {
			LuceneTest t = new LuceneTest();
			t.createIndex();
			t.searchByKeyWords(QUERY_STR);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 *  创建索引
	 * @throws Exception
	 */
	private void createIndex() throws Exception{
		Long startTime = System.currentTimeMillis();
		File indexDir = new File(FILE_INDEX);
		Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_44);
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, luceneAnalyzer);
		config.setOpenMode(OpenMode.CREATE);
		Directory directory = FSDirectory.open(indexDir);
		IndexWriter indexWriter = new IndexWriter(directory, config);
		List<String> fileList = new ArrayList<String>();
		FileUtils.listFile(new File(FILE_TARGET), fileList);
		for(String filePath : fileList){
			System.out.println("文件:" + filePath + "正在被索引....");
			String content = readFile(filePath);
			Document doc = new Document();
			doc.add(new TextField("content", content.toString(), Store.YES));
			doc.add(new TextField("path", filePath, Store.YES));
			indexWriter.addDocument(doc);
		}
		indexWriter.close();
		Long endTime = System.currentTimeMillis();
		System.out.println("花费了" + (endTime - startTime) + "毫秒来创建索引文件");
		
	}
	/**
	 *  读取文件内容
	 * @param filePath
	 * @return
	 * @throws Exception
	 */
	private String readFile(String filePath) throws Exception{
		@SuppressWarnings("resource")
		BufferedReader bufferedReader = new BufferedReader(
				new InputStreamReader(new FileInputStream(filePath)));
		StringBuffer content = new StringBuffer();
		String str = null;
		while ((str = bufferedReader.readLine()) != null) {
			content.append(str).append("\n");
		}
		return content.toString();
	}
	
	
	private void searchByKeyWords(String keyWords) throws Exception{
		IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(FILE_INDEX)));
		IndexSearcher searcher = new IndexSearcher(reader);
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
		QueryParser parser = new QueryParser(Version.LUCENE_44, "content",analyzer);
		Query query = parser.parse(keyWords);
		TopDocs results = searcher.search(query,1000);
		ScoreDoc[] score = results.scoreDocs;
		if (score.length == 0) {
			System.out.println("对不起,没有找到您要的结果。");
		} else {
			System.out.println("查找["+QUERY_STR+"]有" + score.length + "个结果");
			for (int i = 0; i < score.length; i++) {
				try {
					Document doc = searcher.doc(score[i].doc);
					System.out.print("这是第" + i + "个检索到的结果,文件名为:");
					System.out.println(doc.get("path"));
					System.out.println("内容:\n" + doc.get("content"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

   代码中的常量可以通过文档来查看,运行后就可以看到搜索的结果了。

 

   当然这里只是对txt进行搜索,你还可以对word,excel,pdf等文档进行搜索,前提是要将其内容读取出来,创建索引即可。

 

  • 大小: 45.1 KB
分享到:
评论

相关推荐

    lucene4.9初体验(源码附件)

    《Lucene 4.9初体验:深入源码解析》 Apache Lucene 是一个高性能、全文本搜索引擎库,被广泛应用于各种搜索应用中。本文主要针对Lucene 4.9版本进行探讨,通过源码阅读,帮助读者深入了解其内部工作原理和机制。 ...

    Lucene3.0之结果排序

    在信息检索领域,如何有效地组织和展示检索结果对于提升用户体验至关重要。传统的信息检索系统返回的结果往往需要进行“相关排序”(relevance ranking),即根据结果与查询之间的相关程度对结果进行排序。这种排序...

    SearchDemo lucene.net

    通过学习和实践"SearchDemo",开发者可以深入了解Lucene.NET的工作原理,掌握如何在自己的项目中有效利用这个强大的搜索引擎库,从而提升信息检索的效率和用户体验。无论你是初涉全文搜索,还是希望进一步提升搜索...

    Lucene的应用

    到了20世纪90年代末至21世纪初,Infoseek、AltaVista以及Google和百度等搜索引擎的兴起标志着搜索引擎行业的繁荣期。 - **全文检索系统**:全文检索系统是指通过对文档中的每个词汇建立索引的方式,实现对文档内容...

    nutch初体验

    《Nutch初体验:深入解析开源搜索引擎框架》 Nutch是一个开源的全文搜索引擎项目,它主要专注于网络爬虫和信息提取。Nutch以其强大的可扩展性和灵活性,被广泛用于构建大规模的网页抓取和索引系统。在这个初体验中...

    Solr初体验

    Solr初体验 Apache Solr 是一款开源的全文搜索引擎,基于 Lucene 库,提供了高效、可扩展的搜索和分析功能。它不仅用于网站的全文检索,还广泛应用于企业级的文档检索、商品搜索以及数据挖掘等领域。这篇博客将带你...

    solr初体验

    Solr初体验:深入理解开源全文搜索引擎 Solr,全称Apache Solr,是一个高度可扩展的、开源的全文搜索引擎平台。它允许开发者通过HTTP接口对大量文本数据进行高效的搜索和分析。Solr由Java编写,是Apache软件基金会...

    ElasticSearch入门(一)单节点初体验

    ES作为MySQL等关系型数据库的LIKE功能出现(当然这只是简单的类比),基于Apache的Lucene实现,提供RESTful风格的操作(增删改查)。随着ES生态的不断繁荣,结合ELK(ElasticSearch, Logstash, Kibana

    java基础开发文档

    7. **Lucene和Solr**: Lucene是Java的全文检索库,而Solr是在Lucene基础上构建的搜索引擎服务器。它们用于实现高效的文本搜索功能,理解和掌握这些技术对于提升网站和应用的搜索体验至关重要。 8. **综合案例知识点...

    nutch入门.pdf

    Nutch初体验部分涉及爬行企业内部网和爬行全网。这一部分详细介绍了如何配置Nutch以及Tomcat,执行抓取命令,并对结果进行测试。其中,爬行企业内部网涉及到IntranetRecrawl,而爬行全网则详细讨论了爬行官方网址和...

    elasticsearch

    Elasticsearch设计之初就考虑了分布式场景,它支持数据的自动分片和复制,能够轻松扩展到数百甚至上千个节点,处理PB级别的数据。每个节点都可以独立工作,并且可以通过添加更多节点来提高系统的容错性和可扩展性。...

    Nutch入门.rar

    3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1 配置nutch....7 3.1.2 配置tomcat..8 3.1.3 执行抓取命令......9 3.1.4 测试结果...11 3.1.5 Intranet Recrawl..13 3.2 爬行全网.....18 3.2.1 nutch数据集...

    nutch 初学文档教材

    3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1 配置nutch....7 3.1.2 配置tomcat..8 3.1.3 执行抓取命令......9 3.1.4 测试结果...11 3.1.5 Intranet Recrawl..13 3.2 爬行全网.....18 3.2.1 nutch数据集的基本...

    nutch入门学习

    nutch初体验 在初步接触Nutch时,用户可以通过以下几种方式实践: - **爬行企业内部网**:通过配置Nutch,可以抓取公司内网的网页,了解Nutch的基本操作流程。 - **爬行全网**:了解Nutch的数据集构成,尝试抓取...

    nutch入门实例教程.pdf

    Nutch 初体验 - **爬行企业内部网**: - **配置 Nutch**: 设置抓取规则、URL 范围等。 - **配置 Tomcat**: 适配 Nutch 的 Web 界面设置。 - **执行抓取命令**: 使用 `bin/nutch crawl` 命令开始抓取。 - **测试...

    kibana-6.2.4_.tar.gz

    Kibana是Elastic Stack中的一个重要组件,版本6.2.4是其在2018年初发布的一个稳定版本。它是一个基于Web的界面,专为Elasticsearch设计,旨在帮助用户对收集到的海量数据进行可视化分析和交互式探索。通过Kibana,你...

Global site tag (gtag.js) - Google Analytics