我是看Lucene in action学习的,也想一步一步学的猿们可以移步。这本书是基于lucene 3.0 写的,里面还是有一些api已经没有了或者过时了,我是用5.0测试的。
先把书里面的我不会的单词列一下:
第一部分
创建索引时,核心类有以下几个 :
IndexWriter
- 当你不是读或者查询索引的时候就用它
Directory
- 用来存储索引
- 可以用
FSDirectory
来获取,作为IndexWriter的参数 FSDirectory
和RAMDirectory
区别是前者把索引存储到文件当中,后者把索引存储到内存当中,当只用于小数据的时候,或者简单测试的时候用后都比较合适,像书中的一些单元测试用的都是后者
- Analyzer
- 分词工具的类型,当做IndexWriter的构造函数,但是在我的5.0.0里面已经换了,可以用
IndexWriterConfig
来配置,用什么样的分词决定你分的效果
- 分词工具的类型,当做IndexWriter的构造函数,但是在我的5.0.0里面已经换了,可以用
Document
- 用来存放多个field,正常用于作者,文章名称,日期等等
Field
- 是按键值对存放的,Field很少直接用,都是用它的子类
查询索引时,核心类有以下几个 :
- IndexSearcher
- 在5.0.0里面的构造函数
,正常我们只是用第一个。
- 然后IndexReader可以用
,官方推荐第二种,因为如果通过IndexWriter修改了索引,而你就必须创建一个新的IndexReader才能看到变化,但你把当前的IndexWriter传进去,就可以看到最新的索引了。
- 在5.0.0里面的构造函数
- Term
- Query
- TermQuery 最基本的一个query
- TopDocs 查询结果展示
第二、三部分
在分词的时候,会把一些英文转成小写,调用
LowerCaseFilter
,除了一些常用的单词eg: a, an, the , in , on
,用StopFilter第二、三部分代码片段
用CreateTestIndex生成索引的时候,把resources下面的文件拷到你的电脑文件下面就可以了。改下里面的路径
这里遇到一个问题就是在用QueryParser转成NumericRangeQuery时,它默认的是TermRangeQuery,这里我们要自己写一个QueryParer,
在测试QueryParser转PrefixQuery时,有关于路径问题,建议用KeywordAnalyzer
123456789QueryParser parser = new QueryParser("category", new KeywordAnalyzer());Query query = parser.parse("\\/computers\\/programming*");System.out.println(query.toString("category"));TopDocs docs = searcher.search(query, 10);int programmingAndBelow = docs.totalHits;System.out.println("programmingAndBelow:" + docs.totalHits);QueryParser parserT = new QueryParser("category", new KeywordAnalyzer());query = parserT.parse("\\/computers\\/programming");
常用的Query子类:
- NumericRangeQuery 和 TermRangeQuery 范围查询
- PrefixQuery 前缀查询
PhraseQuery 短语查询
the quick brown fox jumped over the lazy dog
查询这句时,
```java
/下面这两种都可以查到,但是位置就不一样了*/
String[] phrase = {“quick”, “fox”};
//slop为1
//移动一步就变成 “quick brown fox”String[] phrase = {“fox”, “quick”};
//slop为3//当你反过来查询的时候,步数就加上quick, 和 brown 和它本身
```
在测试这个建立索引的时候,用IndexOptions.DOCS_AND_FREQS_AND_POSITIONS,之前三个都不支持position
- BooleanQuery 多条件判断查询