八、其他搜索Query

TermRangeQuery

字母范围搜索,不支持数字范围,比较规则:先从第一个字母开始比较,如果第一个字符在查询范围内且不等于开始范围的第一个字母,例如查询范围"jz"--"za",被查询的是lisi,那么就直接匹配了,如果被查询的是jack,由于一个字母相等了,就比较第二个字母,依次类推。

 

    public void searchByTermRange(String field, String start, String end, int num) {
        try {
            IndexSearcher searcher = getSearcher();
            Query query = new TermRangeQuery(field, start, end, true, true);//是否包含开始,是否包含结束
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查询了:" + tds.totalHits);
            for (ScoreDoc sd : tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println("id:" + doc.get("id"));
                System.out.println("name:" + doc.get("name"));
                System.out.println("email:" + doc.get("email"));
                System.out.println("attach:" + doc.get("attach"));
                System.out.println("date:" + doc.get("date"));
                System.out.println("content:" + doc.get("content"));
                System.out.println("======================");
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

su.searchByTermRange("name", "jz", "mi", 10);

 

NumericRange

数字范围查询

Query query = NumericRangeQuery.newIntRange (field, start, end, true, true); //是否包含开始,是否包含结束

 

su.searchByNumricRange("attach", 2, 10, 5);

 

PrefixQuery

通过字符串前缀来查询。

Query query = new PrefixQuery(new Term(field, value));

 

//查询以sex开头的

su.searchByPrefix("content", "sex", 10);

 

WildcardQuery

通配符查询。

//在传入的value中可以使用通配符:?和*,?表示匹配一个字符,*表示匹配任意多个字符
Query query = new WildcardQuery(new Term(field, value));

 

 //匹配@itat.org结尾的所有字符
 su.searchByWildcard("email", "*@itat.org", 10);
 //匹配j开头的有三个字符的name
 su.searchByWildcard("name", "j???", 10);

 

BooleanQuery

用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。

必须包含,不能包含,可以包含三种.有以下6种组合 : 
1.MUST和MUST:取得连个查询子句的交集。 
2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应的查询子句的检索结果。 
3.SHOULD与MUST_NOT:连用时,功能同MUST和MUST_NOT。
4.SHOULD与MUST连用时,结果为MUST子句的检索结果,但是SHOULD可影响排序。
5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。
6.MUST_NOT和MUST_NOT:无意义,检索无结果。

 

BooleanQuery query = new BooleanQuery();
query.add(new TermQuery(new Term("name", "zhangsan")), Occur.MUST);
query.add(new TermQuery(new Term("content", "welcome")), Occur.MUST_NOT);

 

PhraseQuery :

短语查询。

query.add(new Term("content", "pingpeng"));
query.add(new Term("content", "i"));
query.setSlop(3);//要求结果中不仅包含上面的term,并且两个Term之间的间隔不能超过3

 

FuzzyQuery

模糊查询,在FuzzyQuery类定义中定义了两个成员变量:

private float minimumSimilarity;

private int prefixLength;

minimumSimilarity是最小相似度,取值范围为0.0~1.0,包含0.0但不包含1.0,默认值为0.5。prefixLength是前缀长度,默认为0。

minimumSimilarity表示是最小相似度,可以通过指定一个相似度来决定模糊匹配的严格程度。默认为0.5,当这个值越小,通过模糊查找出的文档的匹配程度就越低,

文档的数量也就越多;当这个值越大,说明要匹配程度更大,匹配的文档数也就越少,当相似度设置为1,那么就退化为TermQuery查询,所以当这个值>=1或<0会抛出IllegalArgumentException异常。

另外一个参数prefixLength表示在进行模糊匹配的时候,要有多少个前缀字母必须完全匹配。例如当该值设置为“1”,则表示所有此条只有第一个字母与检索关键字相符时,才会被集合选中。

 

FuzzyQuery query = new FuzzyQuery(new Term("name", "zhang"), 0.1f, 0);

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值