1.文件夹
org.apache.lucene.store.Directory
指定索引所在文件夹。
org.apache.lucene.store.RAMDirectory
存放于内存中的文件夹。
org.apache.lucene.store.RAMDirectory.RAMDirectory(FSDirectory dir, IOContext context)
构造函数。把文件索引加载内存中。
org.apache.lucene.store.FSDirectory
抽象类,代表磁盘中的文件夹。有三个实现类:MMapDirectory、NIOFSDirectory与SimpleFSDirectory。
2.文档
org.apache.lucene.document.Document
文档是索引存储与搜索的基本单位。
org.apache.lucene.document.Document.Document()
默认构造函数。
void org.apache.lucene.document.Document.add(IndexableField field)
向文档中加入一个字段。
String org.apache.lucene.document.Document.get(String name)
依据field name拿内容。
若不存在返回null。
String org.apache.lucene.document.Document.toString()
内容格式为:Document<字段1信息 字段2信息 ... 字段n信息>。
一个样例为:Document<stored,indexed,tokenized,omitNorms,indexOptions=DOCS<id:4> stored,indexed,tokenized<content:try everything>>
3.字段
org.apache.lucene.document.Field
基类。
通常会使用它的多个子类。
org.apache.lucene.document.Field.Store
Field类的内部枚举类。
有enum{YES,NO}两个值。
3.1 FieldType
org.apache.lucene.document.FieldType
描写叙述一个Field的配置信息,包含是否分词、是否存储等。
org.apache.lucene.document.FieldType.FieldType()
默认构造函数。
void org.apache.lucene.document.FieldType.setStored(boolean value)
设置为true表示要在正向文件.fdx/.fdt中存储这个域。
void org.apache.lucene.document.FieldType.setTokenized(boolean value)
设置为true表示对内容依照预先配置的analyzer进行分词。
3.2 TextField
org.apache.lucene.document.TextField
Field的子类。
org.apache.lucene.document.TextField.TextField(String name, String value, Store store)
构造函数。
内部调用setTokenized(true)实现分词。一般用于文档正文。
3.3 StringField
org.apache.lucene.document.StringField
Field的子类。
org.apache.lucene.document.StringField.StringField(String name, String value, Store stored)
构造函数。
内部调用setTokenized(false)设置不分词。一般用于国家名、作者名、id等。
3.4数字类型
org.apache.lucene.document.NumericDocValuesField
存储long类型。
日期与时间也能够转换为数字类型存储与筛选。
org.apache.lucene.document.DoubleDocValuesField
存储double类型。
4.建索引
org.apache.lucene.index.IndexWriter
创建并维护索引的类。
org.apache.lucene.index.IndexWriter.IndexWriter(Directory d, IndexWriterConfig conf)
构造函数。
org.apache.lucene.index.IndexWriterConfig
代表IndexWriter的配置。
org.apache.lucene.index.IndexWriterConfig.IndexWriterConfig(Analyzer analyzer)
构造函数。
4.1 添加文档
void org.apache.lucene.index.IndexWriter.addDocument(Iterable<? extends IndexableField> doc)
向索引中加入文档。
4.2 删除文档
void org.apache.lucene.index.IndexWriter.deleteDocuments(Term... terms)
删除指定的文档。假设仅仅想删除单个文档。务必确保传入的域值仅仅会匹配到单个文档,就像数据库中表的主键PrimaryKey那样。
void org.apache.lucene.index.IndexWriter.deleteDocuments(Query... queries)
删除指定的文档。注意事项同上。
4.3 更新文档
void org.apache.lucene.index.IndexWriter.updateDocument(Term term, Iterable<? extends IndexableField> doc)
首先删除与term匹配的全部文档,然后加入新文档。这种方法是通过调用deleteDocuments()与addDocument()函数实现的。
4.4 其它操作
int org.apache.lucene.index.IndexWriter.maxDoc()
返回索引中未删除+已删除的文档数。
int org.apache.lucene.index.IndexWriter.numDocs()
返回索引中未删除的文档数。
4.5提交更改与关闭
void org.apache.lucene.index.IndexWriter.commit()
一些更改会被缓存,如增删文档、加入索引。调用此方法马上向索引提交待定的更改。
void org.apache.lucene.index.IndexWriter.close()
关闭相关的资源并释放索引的“write lock‘”。关闭前会自己主动提交待定的更改。
5.读索引
org.apache.lucene.index.IndexReader
抽象类。读索引。
DirectoryReader org.apache.lucene.index.DirectoryReader.open(Directory directory)
在指定的文件夹上打开索引。如 IndexReader reader=DirectoryReader.open(directory);
Document org.apache.lucene.search.IndexSearcher.doc(int docID)
依据id读doc。
6.搜索
6.1 search运行
org.apache.lucene.search.IndexSearcher
在单索引上搜索。
org.apache.lucene.search.IndexSearcher.IndexSearcher(IndexReader r)
构造函数。
TopDocs org.apache.lucene.search.IndexSearcher.search(Query query, int n)
搜索并返回top n 的文档。
void org.apache.lucene.search.IndexSearcher.search(Query query, Collector results)
search()的重载函数。
TopFieldDocs org.apache.lucene.search.IndexSearcher.search(Query query, int n,Sort
sort)
search()的重载函数。
6.2 读结果
6.2.1 TopDocs
org.apache.lucene.search.TopDocs
类。表示搜索的返回结果。
float org.apache.lucene.search.TopDocs.getMaxScore()
结果列表中文档的最大得分值。
ScoreDoc[] org.apache.lucene.search.TopDocs.scoreDocs
public 字段。它没有get()方法,直接用。
6.2.2 ScoreDoc
org.apache.lucene.search.ScoreDoc
类。TopDocs内的基本存储单位。有int doc 与float score两个字段。
int org.apache.lucene.search.ScoreDoc.doc
这个ScoreDoc的id。然后可依据IndexSearcher.doc(int docID)拿到原始doc。
6.2.3 TopFieldDocs
org.apache.lucene.search.TopFieldDocs
TopDocs的子类,代表IndexSearcher.search(Query, int, Sort).方法的返回结果。
SortField[] org.apache.lucene.search.TopFieldDocs.fields
字段。
代表者若干排序根据。
ScoreDoc[] org.apache.lucene.search.TopDocs.scoreDocs
继承的父类的字段。盛放的实际是FieldDoc。
org.apache.lucene.search.FieldDoc
ScoreDoc的子类。
Object[] org.apache.lucene.search.FieldDoc.fields
字段。从前到后依次盛放着各项排序标准的分数。为int,float等。
6.1 搜索工作流
IndexSearcher.search()->TopDocs->topdocs.scoreDocs->ScoreDoc[]->docid=ScoreDoc.doc->Document=IndexSearcher.doc(id)
7. Term
org.apache.lucene.index.Term
与field概念类似,仅仅只是field.value为完整的内容,term.value为感兴趣的切分后的词。
org.apache.lucene.index.Term.Term(String fld, String text)
构造函数。
如Term term=new Term("field","content");
“this”、“,”之类的停用词通常会被收录进索引中,但在搜索的时候被过滤掉。
8.Analyzer
对域值分析并生成token。可通俗地理解为分词器。
工作原理及相关类见文章《【lucene】 field->term的分析过程》
9.Query
查询类,抽象类
9.1 TermQuery
TermQuery 最简单、最主要的Query,用来查询不切分的单词。
依靠Term类初始化
如Query query=new TermQuery(term);
9.2 QueryParser
org.apache.lucene.queryparser.classic.QueryParser
此类用于将lucene查询表达式转换为内置的查询类型。
org.apache.lucene.queryparser.classic.QueryParser.QueryParser(String fieldName, Analyzer a)
构造函数。
Query org.apache.lucene.queryparser.classic.QueryParserBase.parse(String query)
得到Query对象。
10.Collector
编写自己定义的Colletor,能够对搜索返回的文档实现更精确的控制。