Indexing:
1. Index.NOT_ANALYZED: 不要分析doc的这个域, 例如:这个域可能是时间,或者关键的号码,不希望 lucene 去解释它,即将这个 filed 当成完整的一个 token,term, 但是这个域是可以检索到的,令这个值唯一可以精确控制索引的文档;
2. Index.ANALYZED_NO_NORMS: 不存储向量信息
3. Index.NO: 不参与索引;
4. 在 lucene 存储索引的时候,通常也要存储 term 出现的次数,位置等,但在有的应用在是不需要的。例如: 筛选, 只要有某个词语就满足要求了,此时使用 Field.setOmitTermFreqAndPositions(true) ,可以加快索引和搜索速度,同时减少存储空间。
5. Store.NO: 不存储域的值,通常和 Index.ANALYZED 一起使用, 例如:对于网页, 对内容检索后,只需要它的 url 即可,需要的时候更具 url 去取即可,还有文件的搜索,保存文件路径即可。
6. TermVectors.YES: 记录出现在该文档中的所有 term, 其信息有出现的位置,次数等, 使用 IndexReader 可以读出来。这里的 postion 和 offset 区别如下:
the quick brown 对于 quick: position = 2, 一个单词一个单词递增, offset为 4 ~ 9 在原文中的字节位置;
对于被分析的存储其分析后的 term, 不存储原始内容。不分析的内容,本身可以看成是一个 term, 这样看来,都是只存储 term 。
Analysis:
text -> token -> term
索引最后使用 term, 同样对于搜索的请求,也转化为 term, 这样就匹配上了~~
使用在2处: indexing 和 searching
Analyzing:
" The quick brown fox jumped over the lazy dogs"
"XY&Z Corporation - xyz@expmaple.com"
$ WhitespaceAnalyzer $:
[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
[XY&Z] [Corporation] [-] [xyz@example.com]
$ SimpleAnalyzer $:
[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
[xy] [z] [corporation] [xyz] [example] [com]
$ StopAnalyzer $:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
[xy] [z] [corporation] [xyz] [example] [com]
$ StandardAnalyzer $:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
[xy&z] [corporation] [xyz@example.com]
注意上面是分别对原始短语直接使用几个分析器,而不是先使用一个,在其得到的结果后再使用另外一个分析器。也就是说,StandAnalyzer同时含有小写,以空格分词的功能,包含了其他分词器的某些功能等。
// 在索引的时候使用分析器的流程:
(1) 所有的 document 使用同样的分析器;
Analyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(directory, analyzer ...);
writer.addDocument(doc)
(2) 对于某个文档使用单独的分析器,但是在搜索的时候进行 QueryParser 的时候也要使用这个分析器,以便 term 结果一致;
writer.addDocument(doc, analyzer);
// 在搜索的时候使用分析器
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(expression);
注意: 如果搜索语句中含有 and or 什么的,这时由 QueryParser 来分析的, 分析器只分析单个text 片段,解析成 term 形式,这是好理解的。
分析器需要实现的函数:
public TokenStream tokenStream(String fieldName, Reader reader)