【Lucene02】索引和搜索建立
来源:互联网 发布:mac os怎么卸载软件 编辑:程序博客网 时间:2024/06/06 16:48
1、索引
1、创建索引库IndexWriter
2、根据文件创建文档Document
3、向索引库中写入文档内容
对文档建立索引,Lucene提供了5个类:Document, Field, IndexWriter, Analyzer, Directory.
1、Document
用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。2、Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。3、Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。4、IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,它的作用是把一个个的 Document 对象加到索引中来。5、Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
package TestLucene; import java.io.File; import java.io.FileReader; import java.io.Reader; import java.util.Date; 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; import org.apache.lucene.index.IndexWriter; public class TxtFileIndexer { public static void main(String[] args) throws Exception{ File indexDir = new File("D:\\luceneIndex"); File dataDir = new File("D:\\luceneData"); Analyzer luceneAnalyzer = new StandardAnalyzer(); File[] dataFiles = dataDir.listFiles(); IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true); long startTime = new Date().getTime(); for(int i = 0; i < dataFiles.length; i++){ if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){ System.out.println("Indexing file " + dataFiles[i].getCanonicalPath()); Document document = new Document(); Reader txtReader = new FileReader(dataFiles[i]); document.add(Field.Text("path",dataFiles[i].getCanonicalPath())); document.add(Field.Text("contents",txtReader)); indexWriter.addDocument(document); } } indexWriter.optimize(); indexWriter.close(); long endTime = new Date().getTime(); System.out.println("It takes " + (endTime - startTime) + " milliseconds to create index for the files in directory " + dataDir.getPath()); } }
package org.algorithm;import java.io.File;import java.io.IOException;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.StringField;import org.apache.lucene.document.Field.Store;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;/* * lucene索引的建立 * */public class IndexFilesDemo { public static String content = ""; //创建索引库IndexWriter public static IndexWriter getIndexWriter(String indexPath) throws IOException{ Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40); Directory dir = FSDirectory.open(new File(indexPath));//确定索引文件存储的位置 //创建索引 IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer); IndexWriter writer = new IndexWriter(dir, config); return writer; } //根据文件创建文档Document public static void index(IndexWriter writer,String path) throws IOException{ List<File> filelist = getFileList(path); for(File file :filelist){ Document doc = new Document(); //向索引库中写入文档内容 doc.add(new StringField("filename", file.getName(),Store.YES)); doc.add(new StringField("content", content, Store.YES)); doc.add(new StringField("path", file.getPath(), Store.YES)); writer.addDocument(doc);//添加进写入流里 writer.forceMerge(1);//优化压缩段,大规模添加数据的时候才使用 writer.commit();//提交数据 System.out.println("索引添加成功!"); } } public static List<File> getFileList(String path){ File[] files = new File(path).listFiles(); List<File> filelist = new ArrayList<File>(); for(File file:files){ filelist.add(file); } return filelist; } public static void main(String[] args) throws IOException { String indexPath = "E:/luceneTxt"; String path = "e:/luceneindextxt"; IndexWriter writer = getIndexWriter(path); getFileList(indexPath); index(writer,indexPath); }}
2、搜索
1、打开索引库IndexSearcher
2、根据关键词进行搜索
3、遍历结果并处理
在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene 提供了几个基础的类来完成这个过程,它们分别是呢 IndexSearcher, Term, Query, TermQuery, Hits.
1、IndexSearcher
IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。2、Term
Term 是搜索的基本单位,一个 Term 对象有两个 String 类型的域组成。生成一个 Term 对象可以有如下一条语句来完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一个参数代表了要在文档的哪一个 Field 上进行查找,第二个参数代表了要查询的关键词。3、Query
这是一个抽象类,它有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query4、TermQuery
TermQuery 是抽象类 Query 的一个子类,它同时也是 Lucene 支持的最为基本的一个查询类。生成一个 TermQuery 对象由如下语句完成:
TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的构造函数只接受一个参数,那就是一个 Term 对象。5、Hits
Hits 是用来保存搜索的结果的。
package TestLucene; import java.io.File; import org.apache.lucene.document.Document; import org.apache.lucene.index.Term; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.TermQuery; import org.apache.lucene.store.FSDirectory; public class TxtFileSearcher { public static void main(String[] args) throws Exception{ String queryStr = "lucene"; File indexDir = new File("D:\\luceneIndex"); FSDirectory directory = FSDirectory.getDirectory(indexDir,false); IndexSearcher searcher = new IndexSearcher(directory); if(!indexDir.exists()){ System.out.println("The Lucene index is not exist"); return; } Term term = new Term("contents",queryStr.toLowerCase()); TermQuery luceneQuery = new TermQuery(term); Hits hits = searcher.search(luceneQuery); for(int i = 0; i < hits.length(); i++){ Document document = hits.doc(i); System.out.println("File: " + document.get("path")); } } }
package org.algorithm;import java.io.File;import java.io.IOException;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;public class IndexSearcherDemo { /* * 1、打开索引库IndexSearcher * 2、根据关键词进行搜索 * 3、遍历结果并处理 * */ public static void searchIndex(String indexPath,String term) throws IOException{ //打开索引库 Directory directory = FSDirectory.open(new File(indexPath));//打开索引位置 IndexReader reader = DirectoryReader.open(directory); IndexSearcher search = new IndexSearcher(reader); //根据关键词进行搜索 TopDocs docs = search.search(new TermQuery(new Term("content",term)),20); //遍历结果并处理 ScoreDoc[] hits = docs.scoreDocs; System.out.println(hits.length); for(ScoreDoc hit:hits){ System.out.println("doc:"+hit.doc+".txt"+" "+"score:"+hit.score); } reader.close(); } public static void main(String[] args) throws IOException { String indexPath = "E:/luceneindextxt"; searchIndex(indexPath,"you"); }}
- 【Lucene02】索引和搜索建立
- Lucene 建立索引和搜索
- 【Lucene02】索引的相关概念
- 建立索引,搜索关键字
- lucene3.5学习笔记02--创建索引和建立搜索
- lucene3.5建立索引和搜索的简单步骤
- 搜索引擎–elasticsearch python客户端pyes 建立索引和搜索
- Luence 课程1----索引和搜索的建立
- lucene建立索引和各种方式的搜索
- 搜索的前提:建立索引
- 搜索引擎–Python文本文件分割、PyLucene建立索引和索引搜索
- 建立SQL全文索引提升搜索速度
- Lucene 建立索引数据库 实现搜索网页
- 搜索技术--建立索引(lucene3.0)
- lucene 建立多索引搜索器
- 建立SQL全文索引提升搜索速度
- 使用Coreseek建立全文搜索索引
- lucene的建立索引,搜索,中文分词
- 支付宝封装
- KVC的使用
- 第四周《C语言及程序设计》实践项目39 问题求解——求素数
- POJ3295 Tautology
- 用Eclipse进行远程Debug代码
- 【Lucene02】索引和搜索建立
- 把字符串转换成整数
- html是什么
- [leetcode]105. Construct Binary Tree from Preorder and Inorder Traversal
- c语言:素数和(教训,调试时随手写的语句记得删掉)
- CentOS7安装chrome
- 不忘初心(半年总结)
- android中webservice的开发
- Intent跳转及属性