LuceneInAction(第2版)学习笔记——第一章 初识Lucene

来源:互联网 发布:tower for mac 编辑:程序博客网 时间:2024/05/17 22:06


Lucene: 是一个搜索类库,而不是完整的程序


A. 索引组件

 

根据原始内容创建索引
Raw Content : Acquire Content    --> Build Document --> Analyze Document(*) --> Index Document(*) ==> Index(*)
原始内容    : 获取内容(提取文本) --> 建立文档     --> 分析文档     --> 文档索引   ==> 索引

文档索引=向索引添加文档

***** 索引过程中的核心类
Document类:  一个Lucene文档可以包含多个域Field
Analyzer(*****)类: 分析器 分析文档,如果被索引内容不是纯文本文件,则需要先将其转换为文本文档
  分析器是一个抽象类,Lucene提供了几个类实现它
  分析器的分析对象是文档,该文档包含一些分离的能被索引的域
IndexWriter类: 索引写入器,它负责创建新索引或打开已有索引,以及向索引中添加、删除、更新被索引文档的信息
  IndexWrite 提供对索引文件的写入操作,但不能用于读取或搜索索引
Directory类: 索引文件的存储路径

 


B. 搜索组件

 

 在索引中搜索单词,找到包含该单词的文档
Search UI   : Build Query(*)  --> Run Query(*) --> Render Results(*)
用户搜索界面: 建立查询       --> 运行查询     --> 展现结果

*****搜索过程中的核心类
IndexSearcher类: 搜索器,用于搜索由IndexWriter类创建的索引,可以将其看作一个以只读方式打开索引的类
  它需要利用Directory实例来掌控前期创建的索引,然后才能提供大量的搜索方法
  搜索器中有一些方法在它的抽象父类Searcher中实现
  最简单的搜索方法是将单个Query对象和int topN计数作为该方法的参数,并返回一个TopDocs对象
Term抽象父类: Term对象是搜索功能的基本单元;与Field对象类似,Term对象包含一对字符串元素,域名和单词(或域文本值)
 Term对象还与索引操作有关。但Term对象是由Lucene内部创建的,在索引阶段不需要了解它们。
 在搜索过程中,可以创建Term对象,并和TermQuery对象一起使用。
 

Directory dir = FSDirectory.open(new File("/tmp/index"));
IndexSearcher searcher = new IndexSearcher(dir);
Query q = new TermQuery(new Term("content", "lucene"));//TermQuery对象是从抽象父类Query中派生而来
TopDocs hits  = searcher.search(q, 10);
searcher.close();

Query抽象父类:有很多查询子类,TermQuery/BooleanQuery/PhraseQuery/PrefixQuery/PhrasePrefixQuery
  /TermRangeQuery/NumericRAngeQuery/FilteredQuery/SpanQuery

TermQuery类: 是Lucene提供的最基本的查询类型,也是简单查询类型之一,它用来匹配指定域中包含特定项的文档
TopDocs类: 就一个简单的指针容器,一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档


C. 其它模块


管理界面: Administration Interface
分析界面: Analytics Interface
搜索范围: Scaling 分布式索引和分布式查询时,各节点的范围


D. 附加组件


中文分词组件
中文短语查询组件
分词: 索引时对域进行分词,搜索时对关键字进行分词,分词后得到语汇单元。

总的来说,搜索比索引更重要,因为索引文件只被创建一次,却要被搜索多次。