屌丝又发少年狂
左键盘,右鼠标
闲来无事学搜索。
好久没有学习新的技术了,一直在项目中晃悠。
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:项目代码见附件。
相关推荐
例如,Analyzer 可能会将 "hello world" 分解为 "hello" 和 "world"。 - **Document**:表示你要索引的信息,可以包含多个字段(Field),如标题、内容等。 - **Field**:文档中的单个数据元素,每个字段都有自己的...
【lucene.net 全文检索】Lucene 是一个高性能、可扩展的信息检索库,它提供了强大的文本搜索功能。在.NET环境中,我们通常使用Lucene.Net,这是一个针对.NET Framework的移植版本。本文主要介绍如何在C#中使用Lucene...
Lucene之所以受欢迎,得益于其诸多优点。首先,它的索引文件格式是跨平台的,允许不同系统或应用之间共享索引数据。其次,Lucene引入了分块索引,可以快速为新内容建立索引,并通过与旧索引合并来优化整个索引结构。...
Elasticsearch是建立在Lunecy之上的一个分布式、实时的搜索和分析引擎,它简化了Lunecy的部署和管理。Elasticsearch具有自动集群、水平扩展、强大的API以及友好的Kibana可视化界面等特点,使得大数据量的搜索和分析...
lunece 学习笔记实用知识库分享知识分享 在本文中,我们将从多方面探索 Lucene 和 Solr 相关的知识点,并对其进行详细的分析和解释。 Lucene 和 Solr 的基本概念 Lucene 是一个基于 Java 的搜索引擎库,提供了...
**正文** 标题“Lucene.net高速创建索引”所涉及的核心技术是Apache Lucene.NET,这是一个开源全文搜索引擎库,它是Lucene项目针对.NET框架的移植版本。Lucene.NET提供了高效、可扩展的文本搜索功能,使得开发者...
Linux Lucene 8.5.1是开源全文检索库Apache Lucene的一个针对Linux平台的最新版本。Lucene是一个高度优化的、用Java编写的搜索引擎库,它为开发人员提供了强大的文本搜索功能,使得构建高性能的全文检索应用变得简单...
《深入理解Lucene 4.10.2:构建高效全文搜索引擎》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。在Java编程语言中,它提供了强大的文本搜索功能,广泛应用于各种信息检索系统。...
**Lucene检索** Lucene是Apache软件基金会的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。这个“Lucene检索”示例将引导我们理解如何利用Lucene进行基本的全文索引和搜索操作。 ...
本篇文章将深入探讨Lucene的几个常见示例,包括`LuceneDemo`、`LuceneZJ`、`Lucene_HelloWorld`,帮助初学者快速理解Lucene的基本操作。 1. **Lucene_HelloWorld** 这个示例是入门Lucene的首选,它展示了如何创建...
作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为...
### Solr 学习知识点详解 #### 一、Solr 概述 - **定义**:Solr 是 Apache 下的一个顶级开源项目,采用 Java 开发,它是基于 Lucene 的全文搜索服务器。Solr 可以独立运行在 Jetty、Tomcat 等 Servlet 容器中。...
自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎...
SpringBoot +Shiro+Mybatis +Thymeleaf +Layui+mysql+Lunece 图片使用的七牛云,属性设置在类cn.coderzhx.utils.VariableName里 如果不想用七牛云那么修改为为tomcat的upload目录 如果仅仅是本地运行项目的话,七牛云...
<br> 自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索...
5.自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...
5.自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...
自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...