Fork me on GitHub

lucene学习

我是看Lucene in action学习的,也想一步一步学的猿们可以移步。这本书是基于lucene 3.0 写的,里面还是有一些api已经没有了或者过时了,我是用5.0测试的。

先把书里面的我不会的单词列一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. asterisk 星号
2. Boosting 增强
3. combine 结合,联合
4. curly brackets 大括号 chunk 块
5. distinguish 区分;辨别
6. demonstrates演示 denoted 表示
7. enumerate 枚举
8. emphasis 突出
9. embed and combine 嵌入并结合
10. Fuzzy 模糊
11. recursively 递归
12. Wildcard 通配符
13. the for loop for循环
14. Norms 规范, 标准
15. hierarchical 分层
16. square brackets 方括号(中括号)
17. optimizing 优化
18. retrieve 索引,搜索
19. groundwork 基础
20.

第一部分

创建索引时,核心类有以下几个 :

  1. IndexWriter

    1. 当你不是读或者查询索引的时候就用它
  2. Directory

    1. 用来存储索引
    2. 可以用FSDirectory来获取,作为IndexWriter的参数
    3. FSDirectoryRAMDirectory区别是前者把索引存储到文件当中,后者把索引存储到内存当中,当只用于小数据的时候,或者简单测试的时候用后都比较合适,像书中的一些单元测试用的都是后者
  3. Analyzer
    1. 分词工具的类型,当做IndexWriter的构造函数,但是在我的5.0.0里面已经换了,可以用IndexWriterConfig来配置,用什么样的分词决定你分的效果
  4. Document

    1. 用来存放多个field,正常用于作者,文章名称,日期等等
  5. Field

    1. 是按键值对存放的,Field很少直接用,都是用它的子类

查询索引时,核心类有以下几个 :

  1. IndexSearcher
    1. 在5.0.0里面的构造函数IndexSearcher构造函数,正常我们只是用第一个。
    2. 然后IndexReader可以用,官方推荐第二种,因为如果通过IndexWriter修改了索引,而你就必须创建一个新的IndexReader才能看到变化,但你把当前的IndexWriter传进去,就可以看到最新的索引了。
  2. Term
  3. Query
  4. TermQuery 最基本的一个query
  5. TopDocs 查询结果展示

第二、三部分

在分词的时候,会把一些英文转成小写,调用LowerCaseFilter,除了一些常用的单词eg: a, an, the , in , on,用StopFilter

第二、三部分代码片段

  • 用CreateTestIndex生成索引的时候,把resources下面的文件拷到你的电脑文件下面就可以了。改下里面的路径

  • 这里遇到一个问题就是在用QueryParser转成NumericRangeQuery时,它默认的是TermRangeQuery,这里我们要自己写一个QueryParer,

  • 在测试QueryParser转PrefixQuery时,有关于路径问题,建议用KeywordAnalyzer

    1
    2
    3
    4
    5
    6
    7
    8
    9
    QueryParser 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 多条件判断查询
坚持原创技术分享,您的支持将鼓励我继续创作!