java——lucene实现全文检索(三)查询语句

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);

猜你喜欢

转载自blog.csdn.net/yilia_jia/article/details/86628083