Lucene (6) Query子类

Submitted by Lizhe on Thu, 12/28/2017 - 15:56

1. TermQuery

对索引中特定项进行搜索, Term是最小的索引片段, 每个Term包含了一个域名和一个文本值.

Term t = new Term("title", "java");

Query q = new TermQuery(t);

使用这个TermQuery对象进行搜索, 可以返回在title域包含单词java的所有文档

注意域值是区分大小写的

2. TermRangeQuery

索引中的各个Term对象会按照字典编排顺序(通过String.compareTo方法)

搜索时包含或不包含起始项和终止项, 如果这个项为空, 那么它对应的端就是无边界的

Query q = new TermRangeQuery("title", new BytesRef("a"), new BytesRef("z"), true, true);

末尾的两个布尔型参数表示 

includeLower - If true, the lowerTerm is included in the range.
includeUpper - If true, the upperTerm is included in the range.

也就是说在上面的例子中, 如果第三个参数为true, 则>=a, 如果为false则 >a, 第四个参数如果为true <=z , 如果为false 则 <z

 

3. NumericRangeQuery

doc.add(new IntField("num", num, Field.Store.YES));

Query q = NumericRangeQuery.newIntRange("num", 1, 2, true, true);

 

4. PrefixQuery

使用PrefixQuery可以搜索包含以指定字符串开头的项的文档

Query q = new PrefixQuery(new Term("isbn","55"));

 

5. BooleanQuery

BooleanQuery可以将之前讨论的这些查询组合成复杂的查询

下面这个例子同时查询了title为L并且isbn以55开头的文档

String querystr = args.length > 0 ? args[0] : "L";
Query q1 = new QueryParser("title", analyzer).parse(querystr);
Query q2 = new PrefixQuery(new Term("isbn","55"));
BooleanQuery q = new BooleanQuery();
q.add(q1, Occur.MUST);
q.add(q2, Occur.MUST);

searcher.search(q, collector);

6. WildcardQuery

通配符查询可以让我们使用不完整的, 缺少某些字幕的项来进行查询, 但仍然可以找到相关的匹配结果

*代表0个或多个字母

?代表0个或者1个字母

Query q = new WildcardQuery(new Term("isbn","5*5*"));