Lucene实践心得笔记

在使用Lucene前,我们先大致熟悉下Lucene的几个核心类。

核心索引类:

public class IndexWriter

  索引过程的中心组件,把它想象成一个可以对索引进行写操作的对象。

public abstract class Directry

  Directory代表索引所在的位置,该抽象类有两个具体的子类实现。FSDirectory表示存储在文件系统的索引位置,RAMDirectory表示存储在内存中的索引位置。

public abstract class Analyzer

分词组件。在建立索引前首先要对文档进行分词,Lucene默认有一些分词类的实现,自己实现的分词要继承该类。

public final class Document

Document类似于数据库中的一条记录,它由好几个字段Field组成。

public final class Field

Field用来描述文档的某个属性,例如文章的标题,内容等等。

核心搜索类:

public class IndexSeacher

用来在已经建好的索引上进行搜索操作

public final class Term

搜索的基本单元。Term对象有两个域组成。Term term = new Term("fieldName","queryWord");

public abstract class Query

抽象类,有很多具体实现类。该类主要作用把用户输入的查询语句转换为Lucene能够是别的query。

public final class Hits(TopDocs)

Hits是用来保存查询得到的结果的。最新版的Lucene中,TopDocs已代替了Hits。

   我们拿一张纸、一支笔,填写下面的表格:    

序号

 

文件名

 

文件路径

 

文件类型

 

文件大小

 

修改时间

 

内容

 

……

 
                               

填完以后,搜索的时候就可以照着这张纸“按图索骥”了。

在lucene中,这张纸叫做Directory(也就是索引保存的目录),这支笔叫做IndexWriter,表格中一条记录叫做Document,记录中的每项叫做Field。

下面我们来看第一个简单的Lucene实现索引的例子(Lucene版本为4.10.1)。 public class LuceneDemo { public static void main(String[] args){ //RAMDirectory(内存路径)继承自Directory抽象类,另一个继承自该类的是FSDirectory(文件系统路径),Directory dir = FSDirectory.open(new File("此处写索引存储的位置,")); Directory dir = new RAMDirectory(); //SimpleAnalyzer继承自抽象类Analyzer,是分词组件,不同语言有不同的分词组件包,也可以自己定义实现该抽象类 Analyzer analyzer = new SimpleAnalyzer(); //定义IndexWriterConfig IndexWriterConfig iwc = new IndexWriterConfig(Version.LATEST, analyzer); //定义document对象 Document doc = new Document(); try { //第一步,切词入库,创建索引。定义IndexWriter对索引进行“写”操作 IndexWriter iw = new IndexWriter(dir, iwc); //Field对象的构造方法有四个参数,前两个参数表示要建立索引的name和value,name指索引的名称,value指要建立索引的“文档对象”,例如博客的标题、正文 //Field.Store有YES和NO两个值,表示是否存储该Field //Field.Index有5个不同的取值,ANALYZED,ANALYZED_NO_NORMS,NOT_ANALYZED,NOT_ANALYZED_NO_NORMS,NO,根据不同情况选择是否分词 doc.add(new Field("title", "james bonde", Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("content","He want to go to school next year.",Field.Store.YES,Field.Index.ANALYZED)); doc.add(new Field("doc","He will go to his mother's home.",Field.Store.YES,Field.Index.ANALYZED)); iw.addDocument(doc); iw.close(); //第二步,查询索引,返回结果 IndexReader ir = DirectoryReader.open(dir); //定义IndexSearcher IndexSearcher is = new IndexSearcher(ir); //定义Term,new Term("doc", "home"),第一个值表示要搜索的域,第二个则表示搜索值 Term term = new Term("doc", "home"); //TermQuery继承自Query抽象类,是Lucene最基本的查询 Query query = new TermQuery(term); //执行查询,返回TopDocs对象结果集 TopDocs td = is.search(query, 10); for(int i=0;i<td.scoreDocs.length;i++){ Document d = is.doc(td.scoreDocs[i].doc); System.out.println("----------"+d.getField("title")); System.out.println("----------"+d.getField("content")); System.out.println("----------"+d.getField("doc")); } dir.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c5f51b0d963358f94fb96884edcc0d99.html