4. Lucene各种查询操作(Lucene6.0.0)

项目源码:https://github.com/tangxing1993/lucene

查找索引库

可以按照关键词查询指定的列,根据相关度返回查询结果,也可以自定义搜索结果的排序方式。

查询过程

IndexSearch是查找索引库的核心API,该类继承抽象类Searcher,查询依赖一个或多个索引库。
提供通用的查询方法:

public void doSearch(Query query){
IndexSearcher searcher = null;
try{
searcher = new IndexSearcher(this.getIndexReader());
TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
Document doc = null;
for(ScoreDoc sd : scoreDocs){
doc = searcher.doc(sd.doc);
System.out.println("docid:"+sd.doc+" | url:"+doc.get("url")+" | content:"+doc.get("content"));
}
}catch(Exception e){
e.printStackTrace();
}
}

常用查询

基本词查询(也叫精确查询,查询不切分的字段)

TermQuery实现精确查询

public void searchByTermQuery(){
TermQuery query = new TermQuery(new Term("content", "java"));
this.doSearch(query);
}

模糊匹配

FuzzyQuery实现模糊查询

public void searchByFuzzy(){
FuzzyQuery  query = new FuzzyQuery(new Term("content", "lucen"));
this.doSearch(query);
}

前缀查询

PrefixQuery实现前缀查询

public void searchByPrefix(){
PrefixQuery query = new PrefixQuery(new Term("content","hello"));
this.doSearch(query);
}

布尔查询(多条件查询,组合条件查询)

BooleanQuery实现多条件查询,旧版本直接构建booleanQuery对象,然后添加查询条件实现查询,新版本先用BooleanQuery.builder构建查询条件,然后构建查询对象实现多条件查询。

public void searchByBoolean(){
//构建一个多条件查询对象  (注意新旧版本的创建方法不一样)  
BooleanQuery.Builder buildQuery = new BooleanQuery.Builder();
//添加一个精确查询,条件必须的  Occur.MUST true Occur.
buildQuery.add(new BooleanClause(new TermQuery(new Term("content", "am")), Occur.MUST));
buildQuery.add(new BooleanClause(new WildcardQuery(new Term("content", "j?v*")),Occur.MUST));
//构建多条件查询对象
BooleanQuery query = buildQuery.build();
this.doSearch(query);
}

短语查询(要求精确匹配的查询)

PhraseQuery实现短语查询

public void searchByPhrase(){
PhraseQuery query = new PhraseQuery("content", "i","am");
this.doSearch(query);
}

范围查询

TermRangerQuery实现范围查询

public void searchByTermRangeQuery(){
TermRangeQuery query = TermRangeQuery.newStringRange("content", "a", "m",true, true);
this.doSearch(query);
}

跨度查询(字词混合查询)

SpanTermQuery是跨度查询

public void searchBySpanTermQuery(){
    SpanNearQuery query = new SpanNearQuery(new SpanQuery[]{
            new SpanTermQuery(new Term("content","i")),
            new SpanTermQuery(new Term("content", "like"))
    }, 1, true);//1表示跨度在一个范围之内    true表示按照数组中给出的顺序出现
    this.doSearch(query);
}

解析查询(万能的查询)

QueryParser是查询语句解析器,可以向解析器内输入查询条件,最后由解析器生成对应的查询对象。

public void searchByQueryParse(){
    QueryParser parser = new QueryParser("content", analyzer); 
    Query query = null;
    try {
        //query = parser.parse("java");   //类似于termQuery 
        //query = parser.parse("url:a.txt");  //切换查找域到url域,查找内容为包含a.txt的内容
        //parser.setAllowLeadingWildcard(true);  //设置首字母允许使用通配符
        //query = parser.parse("url:?.txt");  //类似于WildcardQuery 
        //query = parser.parse("jav~");          //类似于FuzzyQuery          
        //query = parser.parse("am AND like");  //查找内容中包含 am和like的内容
        //query = parser.parse("am OR like");   //查找内容中包含am或者like的值
        //query =parser.parse("[1 TO 3]");       //查找1-3的内容
        query = parser.parse("{1 TO 3}");      //查找包含2的内容
        this.doSearch(query);
    } catch (ParseException e) {
        e.printStackTrace();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值