一、乱碰
去年5、6月份看了下lucene+hibernate简单碰了下,后来又想看但是就丢了。现在打算重新学下,东西感觉挺多的。不知道能不能坚持下。打算做个简单的小搜索。
二、lucene的简单用法
1.创建索引用到的核心类
Directory //描述索引存放的位置 Analyzer //分词器 IndexWriter //对索引的操作,通过分词器和索引目录完成的 Field //每个文档都包含有不同的域(属性),每个域也都有自己的名字 Document //文档的描述通过上面的域进行(好像一个类)
创建索引的一个例子:
String filePath;//文件路径 String indexPath;//索引路径 Directory dir=new FSDirectory.open(new File(indexPath); //创建一个索引存放位置 //声明一个分词器 Analyzer analyzer=new SmartChineseAnalyzer(Version.LUCENE_42,true); IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_42, analyzer); //通过索引指向+分词器 声明一个索引的操作 IndexWriter indexWriter=IndexWriter(dir, iwc); //文档包含的域 Document doc=new Document(); doc.add(new StringField("name",new File(filePath).getName(), Field.Store.YES); doc.add(new StringField("path",new File(filePath).getAbsolutePath(),Field.Store.YES); ..... //把文档添加到对应的分词中 indexWriter。addDocument(doc); indexWrtier.close(); //end
2.创建搜索的主要类
IndexSearcher //索引的搜索操作 Term //搜索的基本单元 也就是对准field里面 单元 关键字 Query //查询 TermQuery //查询query的子类 TopDocs //匹配前N个符合要求的文档
搜索的基本例子:
package com.stx.search; import java.io.File; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.junit.Test; public class Search { @Test public void search() throws Exception { String filePath="E:\\测试lucene\\index"; Directory dir=FSDirectory.open(new File(filePath)); IndexReader reader=DirectoryReader.open(dir); IndexSearcher searcher=new IndexSearcher(reader); Term term=new Term("content", "护照"); TermQuery query=new TermQuery(term); TopDocs hits=searcher.search(query,10); // TermDocs termDocs=searcher. System.out.println("发下数据:"+hits.totalHits); for(ScoreDoc scoreDoc:hits.scoreDocs){ Document doc=searcher.doc(scoreDoc.doc); System.out.println(doc.get("path")); } reader.close(); } }
文本的一个遍历添加索引例子
package com.stx.testlucene; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; 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.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.junit.Test; public class MyLucene { // 测试搜索李敖的本地小说 private String path; // 文本路径 private String indexPath; // 索引存放路径 private int countTxt; // 文件总数统计 private Long startTime; // 开始的时间 private Long endTime; // 搜索结束时间 // private Directory dir; private IndexWriter indexWriter; public MyLucene() throws Exception { path = "E:\\测试lucene\\李敖大全集 TXT版"; indexPath = "E:\\测试lucene\\index"; countTxt = 0; startTime = System.currentTimeMillis(); // 声明索引存放的路径 dir = FSDirectory.open(new File(indexPath)); indexWriter = getWriter(); } // 得到此文件夹下的所有所有文件 @SuppressWarnings("deprecation") public void getAllFile(String nowPath) throws IOException { // 得到文件路径 File file = new File(nowPath); for (File files : file.listFiles()) { if (files.isDirectory()) { getAllFile(files.getCanonicalPath()); } else { if (files.getName().toLowerCase().endsWith(".txt")) { // 文件个数添加一 countTxt++; // 打印出所的的文件路径 System.out.println(files.getAbsolutePath()); // 写入索引了 Document doc = new Document(); doc.add(new StringField("path", files.getAbsolutePath(), Field.Store.YES)); // doc.add(new TextField("content", loadFile(files), // Field.Store.NO)); doc.add(new TextField("content", new FileReader(files))); indexWriter.addDocument(doc); } } } // indexWriter.close(); } // 测试方法遍历所有的文件 public void ceshi() throws IOException { getAllFile(path); endTime = System.currentTimeMillis(); } // 这是个结束输出的提升信息 public void end() throws IOException { indexWriter.close(); System.out.println("总文件数:" + countTxt); System.out.println("时间耗费:" + (endTime - startTime)); } // 返回索引的实例 public IndexWriter getWriter() throws Exception { Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_42, true); IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42, analyzer); return new IndexWriter(dir, iwc); } // 读取文件字符串 public String loadFile(File file) throws IOException { BufferedReader bufferReader = new BufferedReader(new FileReader(file)); StringBuffer buffer = new StringBuffer(); String line = bufferReader.readLine(); while (line != null) { buffer.append(line); line = bufferReader.readLine(); } bufferReader.close(); return buffer.toString(); } @Test public static void main(String[] args) throws Exception { MyLucene m = new MyLucene(); m.ceshi(); m.end(); } }
相关推荐
- **章节1:初识Lucene** - **信息组织与访问的发展**:介绍了从最早的纸质图书到数字化时代的信息检索方式的变化,强调了现代搜索引擎技术的重要性。 - **Lucene是什么**: - **定义**:Lucene是一个高性能、全...
第1章 Lucene初识 Lucene4入门精通实战课程概述 Lucene系统架构 第2章 Lucene索引 Lucene索引里有什么 Lucene索引深入 Lucene索引深入优化 Lucene索引搜索 第3章 Lucene搜索实战 Lucene搜索实战 Lucene搜索深入...
1. 初识Lucene: - 了解Lucene的基本组件,如Analyzer、Document、Field、IndexReader、IndexWriter、Query等。 - 学习如何创建简单的索引和搜索示例。 - 掌握基本的查询语法,如TermQuery、BooleanQuery、...
《Lucene:初识搜索引擎库的“Hello World”》 Lucene,作为Apache软件基金会的顶级项目,是一款高性能、全文本检索引擎库,被广泛应用于各类搜索引擎和信息检索系统中。它提供了完整的搜索功能,包括索引、查询、...
初识Lucene的人可能会误认为它是一个可以直接使用的应用程序,比如文件搜索程序、网络爬虫或网站搜索引擎。实际上,Lucene并非如此,它是一个软件库,更确切地说,是一个工具包,而不是一个完整的功能丰富的搜索应用...
Hadoop 是一个能够处理海量数据的开源软件框架,它最初由Apache Lucene项目演化而来,旨在解决大规模数据处理的问题。Hadoop 2.x 版本相比早期版本有了显著的改进和增强,特别是在性能、稳定性和安全性方面。 - **...
Doug Cutting是著名的开源搜索技术倡导者和创造者,他之前还创立了Lucene和Nutch等项目。 - **命名由来**:Hadoop这个名字来源于Cutting的孩子给一头玩具大象起的名字,它是一个非正式的名称,简单易记,没有特殊...
Elasticsearch 是一款基于 Lucene 的分布式全文搜索引擎,具有高度可扩展性及灵活性。它不仅支持文本搜索,还能进行复杂的数据分析任务,因此在众多企业和组织中被广泛采用。 **主要特点**: - **分布式的全文搜索...
Elasticsearch是基于Apache Lucene构建的开源全文搜索引擎,因其易于使用和高性能的特点深受开发者喜爱。它不仅支持实时搜索,还具备分布式、可扩展的特性,可以处理大规模数据。Elasticsearch不仅适用于传统的搜索...
Elasticsearch(简称ES)是一款基于Lucene的开源分布式搜索引擎,以其强大的全文检索、实时分析和高可扩展性而闻名。它不仅用于传统的搜索功能,还广泛应用于日志分析、监控、物联网(IoT)数据处理等大数据场景。其...
Elasticsearch(简称ES)是一款基于Lucene的开源搜索引擎。它为开发者提供了高效、可靠的搜索和数据分析能力,支持多种数据类型的实时索引与搜索。 **1.2 入门指南** - **1.2.1 初识ES** - Elasticsearch是一个...
第五阶段: 初识⼤数据 1. 难易程度:三颗星 2. 课时量(技术知识点+阶段项⽬任务+综合能⼒):80课时 3. 主要技术包括:⼤数据前篇(什么是⼤数据,应⽤场景,如何学习⼤数据库,虚拟机概念和安装等)、Linux常见...