`
429537044
  • 浏览: 48868 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

lunece入门之HelloWorld

阅读更多

 屌丝又发少年狂

左键盘,右鼠标

闲来无事学搜索。

 

好久没有学习新的技术了,一直在项目中晃悠。

Lucene,上学那会儿就想学习学习了,遥记得当年毕业答辩的时候我用的搜索功能是直接查询数据库,被答辩的老师狠狠的鄙视了。

下面是一个入门级别的demo,写到这里或许可以帮助都别人,主要的是为了自己以后备忘。

step1:下载lucene

step2:新建项目helloworld,并引进必要的包,[You need four JARs: the Lucene JAR, the queryparser JAR, the common analysis JAR, and the Lucene demo JAR. You should see the Lucene JAR file in the core/ directory you created when you extracted the archive -- it should be named something like lucene-core-{version}.jar. You should also see files called lucene-queryparser-{version}.jar, lucene-analyzers-common-{version}.jar and lucene-demo-{version}.jar under queryparser, analysis/common/ and demo/, respectively.] 我们这个demo中用到的是以下几个包:

lucene-analyzers-common-4.4.0.jar ,

lucene-core-4.4.0.jar ,

lucene-queryparser-4.4.0.jar.

step3:准备测试用的文档,我的是

public static final String PATH_INDEX = "E:\\temp\\index";
public static final String PATH_FILE = "E:\\temp\\document";

 PATH_INDEX存放的是索引文件,PATH_FILE存放的是测试文档。

step4:前3步是准备工作,现在开始写代码。代码就不一一描述了,在关键地方我都添加了注释

code1:新建/更新索引

package org.i94livng.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 建索引
 * @author HuHongyu
 *
 */
public class LuceneIndex {
	
	public static final String PATH_INDEX = "E:\\temp\\index";
	
	public static final String PATH_FILE = "E:\\temp\\document";
	
	/**
	 * 创建索引
	 * @throws IOException
	 */
	public void createIndex()throws IOException{
		
		File fileSource = new File(PATH_FILE);
		File[] files = fileSource.listFiles();
		IndexWriter indexWriter =  getIndexWriter();
		for (File file : files) {
			Document document = new Document();
			document.add(new StringField("path", file.getPath(), Store.YES));
			document.add(new TextField("content", getDocumentContent(file), Store.YES));
			document.add(new StringField("fileName",file.getName(),Store.YES));
			//System.out.println(document.get("path"));
			//indexWriter.addDocument(document);
			//避免重复建索引,暂时用文件名进行区分
			indexWriter.updateDocument(new Term("fileName", file.getName()), document);
		}
		indexWriter.close();
		
	}
	
	/**
	 * 获取文件中的数据
	 * @param file
	 * @return
	 * @throws Exception
	 */
	public static String getDocumentContent(File file){
		
		String content = new String();
		StringBuffer sb = new StringBuffer();;
		try {
			FileInputStream fis =  new FileInputStream(file);
			BufferedReader bfr = new BufferedReader(new InputStreamReader(fis));
			String s;
			while((s=bfr.readLine())!=null){
				sb.append(s+"\n");
			}
			fis.close();
			bfr.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		content = sb.toString();
		return content;
	}
	
	/**
	 * 获取IndexWriter
	 * @return
	 * @throws Exception
	 */
	public static IndexWriter getIndexWriter() {
		
		IndexWriter indexWriter = null;
		try {
			Directory directory = FSDirectory.open(new File(PATH_INDEX));
			Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_44);
			IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, luceneAnalyzer);
			indexWriter = new IndexWriter(directory, indexWriterConfig);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return indexWriter;
	}
}

 PS:由于我想读取到文件中的内容,目前我是文件流吧文档中的内容取出来,再放到document中。

code2:搜索文档

 

package org.i94livng.lucene;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
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;

public class LuceneSearch {
	
	public static List<ResultModel> search(Map<String,String> searchMap)throws IOException,ParseException{
		Directory directory = FSDirectory.open(new File(LuceneIndex.PATH_INDEX));
		String serachContent = searchMap.get("content");
		
		IndexReader reader = DirectoryReader.open(directory);
		IndexSearcher searcher = new IndexSearcher(reader);
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
		
		//组装查询条件
		QueryParser parser = new QueryParser(Version.LUCENE_44, "content",analyzer);
		// 将关键字包装成Query对象
		Query query = parser.parse(serachContent);
		//获取准确度就高的5条记录
		TopDocs topDocs =  searcher.search(query, 5);
		
		//获取纪律列表
		ScoreDoc[]scoreDocs = topDocs.scoreDocs;
		//把查询出来的结果转成document 并组装到 ResultModel中
		List<ResultModel> resultList = new ArrayList<ResultModel>();
		
		for (ScoreDoc scoreDoc : scoreDocs) {
			ResultModel resultModel = new ResultModel();
			int docId = scoreDoc.doc;
			Document document = searcher.doc(docId);
			resultModel.setFilePath(document.get("path"));
			resultModel.setFileContent(document.get("content"));
			resultModel.setFileName(document.get("fileName"));
			resultList.add(resultModel);
		}
		
		return resultList;
	}
	
	public static void main(String[] args)throws IOException , ParseException{
		LuceneIndex index = new LuceneIndex();
		index.createIndex();
		Map<String,String> searchMap = new HashMap<String,String>();
		//搜索文档中出现“中”的文档
		searchMap.put("content", "中");
		List<ResultModel> result = search(searchMap);
		for (ResultModel resultModel : result) {
			System.out.println(resultModel.toString());
		}
	}
}
  

  

 code3:搜索出来的结果实体。

package org.i94livng.lucene;

public class ResultModel {
	
	private String fileName;
	private String fileContent;
	private String filePath;

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getFileContent() {
		return fileContent;
	}

	public void setFileContent(String fileContent) {
		this.fileContent = fileContent;
	}

	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}
	
	@Override
	public String toString() {
		return "ResultModel [fileName=" + fileName + ", fileContent="
				+ fileContent + ", filePath=" + filePath + "]";
	}
}

 

 OK,代码就这样了,我执行main方法得到的结果如下

ResultModel [fileName=test3.txt, fileContent=中华人民共和国, filePath=E:\temp\document\test3.txt]
ResultModel [fileName=test5.txt, fileContent=中华人民共和国, filePath=E:\temp\document\test5.txt]

 

 PS:项目代码见附件。

 

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

相关推荐

    lunece 建立索引与查询示例

    例如,Analyzer 可能会将 "hello world" 分解为 "hello" 和 "world"。 - **Document**:表示你要索引的信息,可以包含多个字段(Field),如标题、内容等。 - **Field**:文档中的单个数据元素,每个字段都有自己的...

    lunece全文检索C#

    【lucene.net 全文检索】Lucene 是一个高性能、可扩展的信息检索库,它提供了强大的文本搜索功能。在.NET环境中,我们通常使用Lucene.Net,这是一个针对.NET Framework的移植版本。本文主要介绍如何在C#中使用Lucene...

    lunece

    Lucene之所以受欢迎,得益于其诸多优点。首先,它的索引文件格式是跨平台的,允许不同系统或应用之间共享索引数据。其次,Lucene引入了分块索引,可以快速为新内容建立索引,并通过与旧索引合并来优化整个索引结构。...

    lunece_search_3.0.zip_lunece+es

    Elasticsearch是建立在Lunecy之上的一个分布式、实时的搜索和分析引擎,它简化了Lunecy的部署和管理。Elasticsearch具有自动集群、水平扩展、强大的API以及友好的Kibana可视化界面等特点,使得大数据量的搜索和分析...

    lunece 学习笔记实用知识库分享知识分享

    lunece 学习笔记实用知识库分享知识分享 在本文中,我们将从多方面探索 Lucene 和 Solr 相关的知识点,并对其进行详细的分析和解释。 Lucene 和 Solr 的基本概念 Lucene 是一个基于 Java 的搜索引擎库,提供了...

    Lucene.net高速创建索引

    **正文** 标题“Lucene.net高速创建索引”所涉及的核心技术是Apache Lucene.NET,这是一个开源全文搜索引擎库,它是Lucene项目针对.NET框架的移植版本。Lucene.NET提供了高效、可扩展的文本搜索功能,使得开发者...

    最新版linux lucene-8.5.1.tgz

    Linux Lucene 8.5.1是开源全文检索库Apache Lucene的一个针对Linux平台的最新版本。Lucene是一个高度优化的、用Java编写的搜索引擎库,它为开发人员提供了强大的文本搜索功能,使得构建高性能的全文检索应用变得简单...

    lucene-4.10.2

    《深入理解Lucene 4.10.2:构建高效全文搜索引擎》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。在Java编程语言中,它提供了强大的文本搜索功能,广泛应用于各种信息检索系统。...

    Lucene检索

    **Lucene检索** Lucene是Apache软件基金会的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。这个“Lucene检索”示例将引导我们理解如何利用Lucene进行基本的全文索引和搜索操作。 ...

    Lucene常用的Demo

    本篇文章将深入探讨Lucene的几个常见示例,包括`LuceneDemo`、`LuceneZJ`、`Lucene_HelloWorld`,帮助初学者快速理解Lucene的基本操作。 1. **Lucene_HelloWorld** 这个示例是入门Lucene的首选,它展示了如何创建...

    全文检索 lucene

    作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为...

    solr的学习

    ### Solr 学习知识点详解 #### 一、Solr 概述 - **定义**:Solr 是 Apache 下的一个顶级开源项目,采用 Java 开发,它是基于 Lucene 的全文搜索服务器。Solr 可以独立运行在 Jetty、Tomcat 等 Servlet 容器中。...

    最新.net技术博客源代码.rar

    自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎...

    Blog-online-System:已经上线的SpringBoot博客项目

    SpringBoot +Shiro+Mybatis +Thymeleaf +Layui+mysql+Lunece 图片使用的七牛云,属性设置在类cn.coderzhx.utils.VariableName里 如果不想用七牛云那么修改为为tomcat的upload目录 如果仅仅是本地运行项目的话,七牛云...

    X3BLOG 单用户版 1.0 build80707 (access)

    &lt;br&gt; 自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索...

    x3blog 单用户博客系统 1.0.80802 源代码

    5.自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...

    x3blog 单用户博客系统 1.0.80802 编译版

    5.自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...

    x3blog单用户博客程序源码-1.0.build80802-src

    自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...

Global site tag (gtag.js) - Google Analytics