lucene查询方式介绍

本文首先介绍Lucene一些产用实体类介绍。重点介绍Lucene的集中查询方式。

1、Analysis:分词器

Analysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的StandardAnalyzer。

2、Documet:文档

就是我们的源数据的封装结构,我们需要把源数据分成不同的域,放入到documet里面,到时搜索时也可以指定搜索哪些域(Field)了。

3、Directory : 目录

这是对目录的一个抽象,这个目录可以是文件系统上面的一个dir(FSDirectory),也可以是内存的一块(RAMDirectory),MmapDirectory为使用内存映射的索引。放在内存的话就会避免IO的操作耗时了,根据需要选择就是了。

4、IndexWriter : 索引书写器,也就是维护器,对索引进行读取和删除操作的类

5、IndexReader : 索引读取器,用于读取指定目录的索引。

6、IndexSearcher : 索引的搜索器,就是把用户输入拿到索引列表中搜索的一个类

需要注意的是,这个搜索出来的就是(TopDocs)索引号,还不是真正的文章。

7、Query : 查询语句,我们需要把我们的查询String封装成Query才可以交给Searcher来搜索 ,查询的最小单元是Term,Lucene的Query有很多种,根据不同的需求选用不同的Query就是了.

i. TermQuery:

如果你想执行一个这样的查询:“在content域中包含‘lucene’的document”,那么你可以用TermQuery:

 
   
Term t = new Term( " content " , " lucene " ); Query query = new TermQuery(t);

ii. BooleanQuery:多个query的【与或】关系的查询

如果你想这么查询:“在content域中包含java或perl的document”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:

 
   
TermQuery termQuery1 = new TermQuery( new Term( " content " , " java " ); TermQuery termQuery 2 = new TermQuery( new Term( " content " , " perl " ); BooleanQuery booleanQuery = new BooleanQuery(); booleanQuery.add(termQuery1, BooleanClause.Occur.SHOULD); booleanQuery.add(termQuery2, BooleanClause.Occur.SHOULD);

iii. WildcardQuery : 通配符的查询

如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’useful’或者’useless’:

Query query = new WildcardQuery(new Term("content", "use*");

iv. PhraseQuery : 在指定的文字距离内出现的词的查询

你可能对中日关系比较感兴趣,想查找‘中’和‘日’挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,你可以:

PhraseQuery query = new PhraseQuery();

query.setSlop(5);

query.add(new Term("content ", “中”));

query.add(new Term(“content”, “日”));

那么它可能搜到“中日合作……”、“中方和日方……”,但是搜不到“中国某高层领导说日本欠扁”。

v. PrefixQuery : 查询词语是以某字符开头的

如果你想搜以‘中’开头的词语,你可以用PrefixQuery:

PrefixQuery query = new PrefixQuery(new Term("content ", "中");

vi. FuzzyQuery : 相似的搜索

FuzzyQuery用来搜索相似的term,使用Levenshtein算法。假设你想搜索跟‘wuzza’相似的词语,你可以:

Query query = new FuzzyQuery(new Term("content", "wuzza");

你可能得到‘fuzzy’和‘wuzzy’。

vii. TermRangeQuery : 范围内搜索

你也许想搜索时间域从20060101到20060130之间的document,你可以用TermRangeQuery:

TermRangeQuery query2 = TermRangeQuery.newStringRange("time", "20060101", "20060130", true, true);

最后的true表示用闭合区间。


8、TopDocs :结果集,就是searcher搜索的结果,里面就是一些ScoreDoc,这个对象的doc成员就是这个Id了!

要想得到文章,那么就得需要用这个Id去取文章了,searcher提供了用id得到document的方法,于是就取到了数据了

你可能感兴趣的:(技术总结,Java学习)