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

来源:互联网 发布:网络球机云台设置 编辑:程序博客网 时间:2024/06/06 19:34

项目源码: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();    }}
原创粉丝点击