#徐员外# 如何查询 Lucene 建立索引库后的文档内容?

Posted xuyuanwai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#徐员外# 如何查询 Lucene 建立索引库后的文档内容?相关的知识,希望对你有一定的参考价值。

1.  Lucene索引库查询

         对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Fieldname为“lucene”的文档信息。

         可通过两种方法创建查询对象:

         1)使用Lucene提供Query子类

         Query是一个抽象类,lucene提供了很多查询对象,比如TermQuery项精确查询,NumericRangeQuery数字范围查询等。

         如下代码:

    Query query = new TermQuery(new Term("name", "lucene"));

 

         2)使用QueryParse解析查询表达式

         QueryParse会将用户输入的查询表达式解析成Query对象实例。

         如下代码:

         QueryParser queryParser = new QueryParser("name", new IKAnalyzer());

       Query query =queryParser.parse("name:lucene");

 

 1.1.  使用query的子类查询

  1.1.1.   MatchAllDocsQuery

使用MatchAllDocsQuery查询索引目录中的所有文档

@Test

      publicvoid testMatchAllDocsQuery() throws Exception {

           IndexSearcher indexSearcher = getIndexSearcher();

           //创建查询条件

           Query query = new MatchAllDocsQuery();

           //执行查询

           printResult(query, indexSearcher);

      }

 1.1.2.   TermQuery

TermQuery,通过项查询,TermQuery不使用分析器所以建议匹配不分词的Field域查询,比如订单号、分类ID号等。

指定要查询的域和要查询的关键词。

//使用Termquery查询

      @Test

      publicvoid testTermQuery() throws Exception {

           IndexSearcher indexSearcher = getIndexSearcher();

           //创建查询对象

           Query query = new TermQuery(new Term("content", "lucene"));

           //执行查询

           TopDocs topDocs = indexSearcher.search(query, 10);

           //共查询到的document个数

           System.out.println("查询结果总数量:" + topDocs.totalHits);

           //遍历查询结果

           for (ScoreDoc  scoreDoc : topDocs.scoreDocs) {

                 Document document = indexSearcher.doc(scoreDoc.doc);

                 System.out.println(document.get("filename"));

                 //System.out.println(document.get("content"));

                 System.out.println(document.get("path"));

                 System.out.println(document.get("size"));

           }

           //关闭indexreader

           indexSearcher.getIndexReader().close();

      }

 1.1.3.   NumericRangeQuery

可以根据数值范围查询。

//数值范围查询

      @Test

      publicvoid testNumericRangeQuery() throws Exception {

           IndexSearcher indexSearcher = getIndexSearcher();

           //创建查询

           //参数:

           //1.域名

           //2.最小值

           //3.最大值

           //4.是否包含最小值

           //5.是否包含最大值

           Query query = NumericRangeQuery.newLongRange("size", 1l, 1000l, true, true);

           //执行查询

           printResult(query, indexSearcher);

      }

 1.1.4.   BooleanQuery

可以组合查询条件。

//组合条件查询

      @Test

      publicvoid testBooleanQuery() throws Exception {

           IndexSearcher indexSearcher = getIndexSearcher();

           //创建一个布尔查询对象

           BooleanQuery query = new BooleanQuery();

           //创建第一个查询条件

           Query query1  = new TermQuery(new Term("filename", "apache"));

           Query query2 = new TermQuery(new Term("content", "apache"));

           //组合查询条件

           query.add(query1, Occur.MUST);

           query.add(query2, Occur.MUST);

           //执行查询

           printResult(query, indexSearcher);

      }

 

Occur.MUST:必须满足此条件,相当于and

Occur.SHOULD:应该满足,但是不满足也可以,相当于or

Occur.MUST_NOT:必须不满足。相当于not

 1.2.  使用queryparser查询

通过QueryParser也可以创建QueryQueryParser提供一个Parse方法,此方法可以直接根据查询语法来查询。Query对象执行的查询语法可通过System.out.println(query);查询。

需要使用到分析器。建议创建索引时使用的分析器和查询索引时使用的分析器要一致。

 1.2.1.   QueryParser

需要加入queryParser依赖的jar包。

 1.1.1.1             程序实现

@Test

      publicvoid testQueryParser() throws Exception {

           IndexSearcher indexSearcher = getIndexSearcher();

           //创建queryparser对象

           //第一个参数默认搜索的域

           //第二个参数就是分析器对象

           QueryParser queryParser = new QueryParser("content", new IKAnalyzer());

           Query query = queryParser.parse("Lucene是java开发的");

           //执行查询

           printResult(query, indexSearcher);

      }

 

1.1.1.2             查询语法

1、基础的查询语法,关键词查询:

域名+“:”+搜索的关键字

例如:content:java

2、范围查询

域名+:+[最小值 TO 最大值]

例如:size:[1 TO 1000]

范围查询在lucene中支持数值类型,不支持字符串类型。在solr中支持字符串类型。

3、组合条件查询

1+条件1 +条件2:两个条件之间是并且的关系and

例如:+filename:apache+content:apache

2)+条件1 条件2:必须满足第一个条件,应该满足第二个条件

例如:+filename:apachecontent:apache

3)条件1 条件2:两个条件满足其一即可。

例如:filename:apachecontent:apache

4-条件1 条件2:必须不满足条件1,要满足条件2

例如:-filename:apachecontent:apache

Occur.MUST 查询条件必须满足,相当于and

+(加号)

Occur.SHOULD 查询条件可选,相当于or

 

空(不用符号)

Occur.MUST_NOT 查询条件不能满足,相当于not

-(减号)

 

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

1.2.2.   MultiFieldQueryParser

可以指定多个默认搜索域

@Test

      publicvoid testMultiFiledQueryParser() throws Exception {

           IndexSearcher indexSearcher = getIndexSearcher();

           //可以指定默认搜索的域是多个

           String[] fields = {"filename", "content"};

           //创建一个MulitFiledQueryParser对象

           MultiFieldQueryParser queryParser = new  MultiFieldQueryParser(fields, new IKAnalyzer());

           Query query = queryParser.parse("java AND apache");

           System.out.println(query);

           //执行查询

           printResult(query, indexSearcher);

          

      }


以上是关于#徐员外# 如何查询 Lucene 建立索引库后的文档内容?的主要内容,如果未能解决你的问题,请参考以下文章

#徐员外#《Solr实战》100本技术书之9

#徐员外# Android|sqlite开发视频1~6

#徐员外#《MyCat权威指南》|100本技术书之4

#徐员外#阿里巴巴Dubbo开源服务框架|100本技术书之3

#徐员外#Solr服务器集群及ActiveMQ应用实战

ssm学习——Lucene建立索引