1.TermQuery 词项查询 查询指定字段包含指定词项的文档 TermQuery tq = new TermQuery(new Term("contents", "thinkPad")); 2.BooleanQuery 布尔查询 组合多个子查询 Occur.SHOULD 或 Occur.MUST 且 Occur.MUST_NOT 且非 Occur.FILTER 同MUST 但该字句不参与评分、 默认最大字句数为1024 当产生的字句过多抛出TooManyClauses异常时 可通过BooleanQuery.setMaxClauseCount(int)设置最大字句数 Query query1 = new TermQuery(new Term(filedName, "thinkPad")); Query query2 = new TermQuery(new Term("simpleIntro", "英特尔")); BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); booleanQueryBuilder.add(query1, Occur.SHOULD); booleanQueryBuilder.add(query2, Occur.MUST); BooleanQuery booleanQuery = booleanQueryBuilder.build(); 3.PhraseQuery 短语查询 位移因子决定任意两个词项的位置可最大移动多少个位置来进行匹配 默认0 注意:所有加入的词项都匹配才算匹配,即使是在同一个位置加入多个词项。 如果需要在同一个位置匹配多个同义词中的一个,适合用MultiPhraseQuery PhraseQuery phraseQuery1 = new PhraseQuery("contents", "thinkPad", "carbon"); PhraseQuery phraseQuery2 = new PhraseQuery(1, "contents", "thinkPad", "cabon"); PhraseQuery phraseQuery3 = enw PhraseQuery("contents", "笔记本电脑", "联想"); PhraseQuery phraseQuery4 = new PhraseQuery.Builder() .add(new Term("contents", "笔记本电脑”), 4) .add(new Term("contents", "联想"), 5).build(); //等同于 PhraseQuery phraseQuery5 = new PhraseQuery.builder() .add(new Term("contents", "笔记本电脑"), 0) .add(new Term("contents", "联想"), 1).build(); // String contents = "ThinkPad X1 Carbon 20KH0009CD/25CD 超极本轻薄笔记本电脑联想"; // PhraseQuery 短语查询 PhraseQuery phraseQuery2 = new PhraseQuery(1, "contents", "thinkpad","carbon"); // slop示例 PhraseQuery phraseQuery2Slop = new PhraseQuery(3, "contents", "carbon", "thinkpad"); PhraseQuery phraseQuery3 = new PhraseQuery("contents", "笔记本电脑", "联想"); // slop示例 PhraseQuery phraseQuery3Slop = new PhraseQuery(2, "contents", "联想","笔记本电脑"); 4.MultiPhraseQuery 多重短语查询 支持同位置多个词的OR匹配 Term[] terms = new Term[2]; terms[0] = new Term("contents", "笔记本"); terms[1] = new Term("contents", "笔记本电脑"); Term t = new Term("contents", "联想"); MultiPhraseQuery multiPhraseQuery = new MultiPhraseQuery.Builder() .add(terms).add(t).build(); 5.SpanNearQuery 临近查询(跨度查询) 用于更复杂的短语查询 可以指定词间位置的最大间隔跨度 可以指定是否按顺序排序、slop、gap SpanNearQuery tq1 = new SpanTermQuery(new Term("contents", "thinkPad")); SpanNearQuery tq2 = new SpanTermQuery(new Term("contents", "carbon")); SpanNearQuery spanNearQuery = new SpanNearQuery( new SpanQuery[] { tq1, tq2}, 1, true); SpanNearQuery.Builder spanNearQueryBuilder = SpanNearQuery .newOrderedNearQuery("contents"); SpanNearQueryBuilder.addClause(tq1).addGap(0).setSlop(1) .addClause(tq2); SpanNearQuery spanNearQuery5 = spanNearQueryBuilder.build(); 6.TermRangeQuery 词项范围查询 用于查询包含某个范围内的词项的文档,如以字母开头a到c的词项 词项在反向索引中是排序的, 只需指定的开始词项、结束词项, 就可以查询该范围的词项 做数值的范围查询用 PointRangeQuery TermRangeQuery termRangeQuery = TermRangeQuery.newStringRange("contents", "carbon", "张三", false, true); 参数: 要查询的字段-field 下边界词-lowerTerm 上边界词-upperTerm 是否包含下边界-includeLower 是否包含上边界-includeUpper 7.PrefixQuery, wildcardQuery, RegexpQuery 注意:这三种查询可能会比较慢,慎用 PrefixQuery: 前缀查询 包含以xxx为前缀的词项的文档 是通配符查询 如app实际是app* PrefixQuery prefixQuery = new PrefixQuery(new Term("contents", "think")); WildcardQuery:通配符查询 *表示0个或多个字符 ?表示1个字符 \是转义符 通配符查询较慢 不要以通配符开头 WildcardQuery wildcardQuery = new WildcardQuery(new Term("contents", "think*")); RegexpQuery:正则表达式查询 词项符合某正则表达式 RegexpQuery regexpQuery = new RegexpQuery(new Term("contents", "厉害.{4}")); 8.FuzzyQuery模糊查询 简单地与索引词项进行相近匹配 允许最大2个不同字符 常用于拼写错误的容错,如把“thinkpad"拼成 "thinkd" 仍可搜索到正确结果 FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("contents", "thind")); 9.数值查询 前提:查询的数值字段必须索引 通过IntPoint LongPoint FloatPoint or DoublePoint中的方法构建对应的查询 // 精确值查询 Query exacatQuery = IntPoint.newExactQuery("price", 199900); // 数值范围查询 Query pointRangeQuery = IntPoint.newRangeQuery("price", 499900, 1000000); // 集合查询 Query setQuery = IntPoint.newSetQuery("price", 1999900, 1000000, 2000000);
java——lucene实现全文检索(三)查询语句
猜你喜欢
转载自blog.csdn.net/yilia_jia/article/details/86628083
今日推荐
周排行