在Lucene的查询过程中的主要检索方式有以下四种。
1. 单个词查询
指对一个Term进行查询。比如,若要查找包含字符串“lucene”的文档,则只需在词典中找到Term“lucene”,再获得在倒排表中对应的文档链表即可。
2. AND
指对多个集合求交集。比如,若要查找既包含字符串“lucene”又包含字符串“solr”的文档,则查找步骤如下。
(1)在词典中找到Term “lucene”,得到“lucene”对应的文档链表。
(2)在词典中找到Term “solr”,得到“solr”对应的文档链表。
(3)合并链表,对两个文档链表做交集运算,合并后的结果既包含“lucene”也包含“solr”。
3. OR
指多个集合求并集。比如,若要查找包含字符串“luence”或者包含字符串“solr”的文档,则查找步骤如下。
(1)在词典中找到Term “lucene”,得到“lucene”对应的文档链表。
(2)在词典中找到Term “solr”,得到“solr”对应的文档链表。
(3)合并链表,对两个文档链表做并集运算,合并后的结果包含“lucene”或者包含“solr”。
4. NOT
指对多个集合求差集。比如,若要查找包含字符串“solr”但不包含字符串“lucene”的文档,则查找步骤如下。
(1)在词典中找到Term “lucene”,得到“lucene”对应的文档链表。
(2)在词典中找到Term “solr”,得到“solr”对应的文档链表。
(3)合并链表,对两个文档链表做差集运算,用包含“solr”的文档集减去包含“lucene”的文档集,运算后的结果就是包含“solr”但不包含“lucene”。
通过上述四种查询方式,我们不难发现,由于Lucene是以倒排表的形式存储的,所以在Lucene的查找过程中只需在词典中找到这些Term,根据Term获得文档链表,然后根据具体的查询条件对链表进行交、并、差等操作,就可以准确地查到我们想要的结果,相对于在关系型数据库中的“like”查找要做全表扫描来说,这种思路是非常高效的。虽然在索引创建时要做很多工作,但这种一次生成、多次使用的思路也是非常高明的。