索引的建立,Lucene 提供了五个基础类,分别是 Document, Field, IndexWriter, Analyzer, Directory。以下是他们的用途:
Document
Document 字面意思是文档,这里的文档可以是一个 HTML,一封电子邮件,文本文件,doc文档.......。一个 Document 对象由多个 Field 组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。FSDirecory在程序结束之后能够保存在磁盘中,RAMDirectory在程序运行结束之后将不存在。
代码示例:
其他相关资料:
Field定义:
Field.Store.YES:存储字段值(未分词前的字段值)
Field.Store.NO:不存储,存储与索引没有关系
Field.Store.COMPRESS:压缩存储,用于长文本或二进制,但性能受损
Field.Index.ANALYZED:分词建索引
Field.Index.ANALYZED_NO_NORMS:分词建索引,但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间
Field.Index.NOT_ANALYZED:不分词且索引
Field.Index.NOT_ANALYZED_NO_NORMS:不分词建索引,Field的值去一个byte保存
TermVector表示文档的条目(由一个Document和Field定位)和它们在当前文档中所出现的次数
Field.TermVector.YES:为每个文档(Document)存储该字段的TermVector
Field.TermVector.NO:不存储TermVector
Field.TermVector.WITH_POSITIONS:存储位置
Field.TermVector.WITH_OFFSETS:存储偏移量
Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
分词器
- /**
- * SimpleAnalyzer 这个分词是一段一段话进行分
- * StandardAnalyzer 标准分词拿来分中文和ChineseAnalyzer一样的效果
- ☆PerFieldAnalyzerWrapper 这个很有意思,可以封装很多分词方式,还可以于先设置field用那个分词分!牛
- * CJKAnalyzer 这个分词方式是正向退一分词(二分法分词),同一个字会和它的左边和右边组合成一个次,每个人出现两次,除了首字和末字
- * ChineseAnalyzer 这个是专业的中文分词器,一个一个字分
- * BrazilianAnalyzer 巴西语言分词
- * CzechAnalyzer 捷克语言分词
- * DutchAnalyzer 荷兰语言分词
- * FrenchAnalyzer 法国语言分词
- * GermanAnalyzer 德国语言分词
- * GreekAnalyzer 希腊语言分词
- * RussianAnalyzer 俄罗斯语言分词
- * ThaiAnalyzer 泰国语言分词
- * KeywordAnalyzer "Tokenizes" the entire stream as a single token. This is useful for data like zip codes, ids, and some product names.
- * PatternAnalyzer api讲这个分词方式很快,它是放在内存里面的
- * SnowballAnalyzer 经典分词用具 主要支持欧洲语言
- * StopAnalyzer 被忽略的词的分词器
- * WhitespaceAnalyzer 空格分词
- * */