query子句解析
lucene中String类型的查询表达式最终会被QueryParse解析为各种Query对象, 直接使用查询表达式和直接使用Query对象的不同在于前者需要配置分词器进行分词, 而后者所见即所得没有分词过程
QueryParser parser = new MyQueryParser(version, "content", analyzer);//默认在content域中查找, 重写了getRangeQuery方法, 可以进行数字范围查询
Query query = null;
//查找content(默认域)中存在软件的结果
query = parser.parse("软件");
//查找name域中有java的结果
query = parser.parse("name:java");
1) TermQuery
要使用TermQuery进行搜索首先需要构造一个Term对象,示例代码如下:
Term aTerm = new Term("contents", "java");
然后使用aTerm对象为参数来构造一个TermQuery对象,代码设置如下:
Query query = new TermQuery(aTerm);
这样所有在“contents”字段中包含有“java”的文档都会在使用TermQuery进行查询时作为符合查询条件的结果返回。
2) BooleanQuery 布尔搜索,对应的查询语句:
a.1 BooleanQuery是实际开发过程中经常使用的一种查询,它其实就是一个组合的Query,在使用中的时候可以把各种Query对象添加进去并且标明它们之间的逻辑关系。
a.2 BooleanQuery是可以嵌套的(BooleanQuery是一个布尔子句的容器)
(1) 一个BooleanQuery可以成为另一个BooleanQuery的条件子句。
(2) 布尔型的子句数目不能跟你超过1024。
a.3 public void add(Query query,BooleanClause.Occur occur),BooleanClause表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST、BooleanClause.Occur.MUST_NOT、BooleanClause.Occur.SHOULD,它含有以下6种组合。
(1) MUST和MUST:取得两个查询子句的交集。
(2) MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应的查询子句的检索结果
(3) MUST_NOT和MUST_NOT:无意义,检索无结果
(4) SHOULD和MUST:无意义,结果为MUST子句的检索结果
(5) SHOULD和MUST_NOT:SHOULD功能同MUST,相当于MUST和MUST_NOT的检索结果
(6) SHOULD和SHOULD:表示"或"的关系,最终检索结果为所有检索子句的并集。
Query query1=new MatchAllDocsQuery();
Query query2=NumericRangeQuery.newIntRange("id", 5, 15, true, false);
booleanQuery.add(query1,Occur.MUST);
booleanQuery.add(query2,Occur.MUST_NOT);
对应的查询字符串为:+*:* -id:[5 TO 15}
3) NumericRangeQuery 范围搜索(MultiTermQuery子类)
b.1 NumericRangeQuery.newIntRange(String field,Integer min,Integer max,boolean minInclusive,boolean maxInclusive); 布尔型的后面的两个参数表示是否可以将两个临界值也加入到搜索中。
例如:Query query=NumericRangeQuery.newIntRange("id", 5, 15, true, false);
对应的查询语句:对应的查询字符串为:id:[5 TO 15}
4) PrefixQuery 前缀查询(MultiTermQuery子类),查询出某个字段以什么开头的信息
Term term= new Term("content","这是");
PrefixQuery query=new PrefixQuery(term);
对应的查询语句:content:这是*
5) PhraseQuery短语查询
d.1 PhraseQuery提供了一种为"坡度"的参数,用于表示词组的两个字之间可以插入无关单词的个数
PhraseQuery phraseQuery=new PhraseQuery();
phraseQuery.add(new Term("title","lucene"));
phraseQuery.add(new Term("title","框架"));
phraseQuery.setSlop(5); //之间的间隔最大不能超过5个
对应的查询语句:title:"lucene 框架"~5
6) FuzzyQuery模糊查询(MultiTermQuery子类)(FuzzyQuery(Term term,int maxEdits))
e.1 maxEdits最小相似度,默认为2,数字越小,查询结果越少,取值范围为0、1、2,当为0的时候相当于TermQuery。
Query query=new FuzzyQuery(new Term("title","lucenX"),2);
对应的查询语句:title:lucenX~2
7) WildcardQuery通配符搜索(MultiTermQuery子类)
f.1 *代表0到多个字符,?代表一个单一的字符。
Query query=new WildcardQuery(new Term("title","lu*n?"));
对应的查询语句是:title:lu*n?
8) MatchAllDocsQuery搜索全部
Query query=new MatchAllDocsQuery();
对应的查询语句是:*:*
9) TermRangeQuery
10) CommonTermsQuery
11) FilteredQuery
......