Lucene: 是一个搜索类库,而不是完整的程序
根据原始内容创建索引
Raw Content : Acquire Content --> Build Document --> Analyze Document(*) --> Index Document(*) ==> Index(*)
原始内容 : 获取内容(提取文本) --> 建立文档 --> 分析文档 --> 文档索引 ==> 索引
文档索引=向索引添加文档
***** 索引过程中的核心类
Document类: 一个Lucene文档可以包含多个域Field
Analyzer(*****)类: 分析器 分析文档,如果被索引内容不是纯文本文件,则需要先将其转换为文本文档
分析器是一个抽象类,Lucene提供了几个类实现它
分析器的分析对象是文档,该文档包含一些分离的能被索引的域
IndexWriter类: 索引写入器,它负责创建新索引或打开已有索引,以及向索引中添加、删除、更新被索引文档的信息
IndexWrite 提供对索引文件的写入操作,但不能用于读取或搜索索引
Directory类: 索引文件的存储路径
在索引中搜索单词,找到包含该单词的文档
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个排名的搜索结果,搜索结果即匹配查询条件的文档
管理界面: Administration Interface
分析界面: Analytics Interface
搜索范围: Scaling 分布式索引和分布式查询时,各节点的范围
中文分词组件
中文短语查询组件
分词: 索引时对域进行分词,搜索时对关键字进行分词,分词后得到语汇单元。
总的来说,搜索比索引更重要,因为索引文件只被创建一次,却要被搜索多次。