lucene搜索之高级查询

  • 使用Query子类查询

MatchAllDocsQuery

TermQuery

NumericRangeQuery

BooleanQuery

  • 使用QueryParser

QueryParser

MulitFieldQueryParser

先抽取公共代码

private void dosearch(Query query) throws IOException {
        //给出索引库位置
        FSDirectory directory = FSDirectory.open(new File("E:\\upload\\lucene"));

        //创建indexReader
        DirectoryReader reader = IndexReader.open(directory);

        //创建search对象
        IndexSearcher searcher = new IndexSearcher(reader);

        TopDocs topDocs = searcher.search(query, 10);
        System.out.println(query);

        ScoreDoc[] ScoreDocs = topDocs.scoreDocs;
        System.out.println(topDocs.totalHits); //查询命中的条数
        for (ScoreDoc scoreDoc:ScoreDocs) {
            int id = scoreDoc.doc;//文档的id
            Document doc = searcher.doc(id);//获取doc对象

            System.out.println(doc.get("id"));
            System.out.println(doc.get("name"));
//            System.out.println(doc.get("price"));
//            System.out.println(doc.get("pic"));
//            System.out.print(doc.get("description"));
        }
      reader.close();
    }

第一个MatchAllDoceQuery,是全匹配,匹配的语法是  *:*

@Test
    public void  doMatchAllDocsQuery() throws Exception {//创建query对象
        MatchAllDocsQuery query = new MatchAllDocsQuery();

        dosearch(query);

    }

第二个 是 TermQuery,是精确匹配,  下面匹配的语法是:  description:项目

TermQuery termQuery = new TermQuery(new Term("description","项目"));
dosearch(query);

第三个NumericRangeQuery,数字的匹配,表示区间

第一个参数:域的名称

第二个参数:最小值

第三个参数:最大值

第四个参数:是否包含最小值

第五个参数:是否包含最大值

域名+“:”+[数值 TO 数值]   表示数值范围,并且包括数值。如果不包括数值 用"{}"

比如:

price:[55.0 TO 70.0]  等同于 55=< price <=70

price:{55.0 TO 70.0]  等同于 55 < price <=70

 @Test
    public void  doNumericRangeQuery() throws Exception {//创建query对象

    NumericRangeQuery price =NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true);

    dosearch(price);

    }

第四个是BooleanQuery,多条件查询

1、MUST和MUST表示“与”的关系,即“交集”。

2、MUST和MUST_NOT前者包含后者不包含。

3、MUST_NOT和MUST_NOT没意义

4、SHOULD与MUST表示MUST,SHOULD失去意义;

5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。

6、SHOULD与SHOULD表示“或”的概念。

 @Test
    public void  doBooleanQuery() throws Exception {//创建query对象

        BooleanQuery query = new BooleanQuery();
        TermQuery query1 = new TermQuery(new Term("name","java"));
        NumericRangeQuery<Float> query2 = NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true);
        query.add(query1, BooleanClause.Occur.SHOULD);
        query.add(query2, BooleanClause.Occur.SHOULD);
        dosearch(query);

    }

query的子类不需要指定分词器,而且不能指定查询的语法

queryparser 需要指定分词器 ,而且可以指定查询的语法

第五个queryParse

TermQuery 是全匹配搜索,如果要搜索一段文字,需要整体匹配才行,如果要搜索包含在这段文字中的词,需要对这段文字进行分词。才能进行搜索。queryparser就可以指定一个分词器,再进行解析,进行查询。

  @Test
    public void  doQueryParse() throws Exception {
         //创建query对象
         Analyzer analyzer=new IKAnalyzer();
         QueryParser parser = new QueryParser("name",analyzer);
//         Query query = parser.parse("*:*");
//         Query query = parser.parse("lucene java");
//         Query query = parser.parse("name:java AND name:编程");
         Query query = parser.parse("+name:java +name:编程");
         dosearch(query);
    }

第六个MultiFieldQueryParser,可进行多个域匹配

@Test
    public void  doMultiFieldQueryParser() throws Exception {

        Analyzer i=new IKAnalyzer();
        String[] fields={"name","description"};
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, i);
        Query query = queryParser.parse("lucene");
        dosearch(query);
    }

数值范围类的查询语法,不支持在queryparser中查询。语法是没有错误的。在solr中可以查询出来。

组合条件查询


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


+(加号)


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


空(不用符号)


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


-(减号)

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

例如:+filename:apache +content:apache

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

例如:+filename:apache content:apache

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

例如:filename:apache content:apache

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

例如:-filename:apache content:apache

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

注意:

Search方法需要指定匹配记录数量n:indexSearcher.search(query, n)

TopDocs.totalHits:是匹配索引库中所有记录的数量

TopDocs.scoreDocs:匹配相关度高的前边记录数组,scoreDocs的长度小于等于search方法指定的参数n

时间: 2024-12-20 23:39:49

lucene搜索之高级查询的相关文章

一步一步跟我学习lucene(16)---lucene搜索之facet查询查询示例(2)

本篇是接一步一步跟我学习lucene(14)---lucene搜索之facet索引原理和facet查询实例(http://blog.csdn.net/wuyinggui10000/article/details/45973769),上篇主要是统计facet的dim和每个种类对应的数量,个人感觉这个跟lucene的group不同的在于facet的存储类似于hash(key-field-value)形式的,而group则是单一的map(key-value)形式的,虽然都可以统计某一品类的数量,显然f

一步一步跟我学习lucene(14)---lucene搜索之facet查询原理和facet查询实例

Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为例,我们选择某一个品牌,系统会将该品牌对应的商品展示出来,效果图如下: 如上图,我们关注的是品牌,选购热点等方面,对于类似的功能我们用lucene的term查询当然可以,但是在数据量特别大的情况下还用普通查询来实现显然会因为FSDirectory.open等耗时的操作造成查询效率的低下,同时普通查询是全部document都扫描一遍,这样显然造成了查询效率低: lucene提供了facet

一步一步跟我学习lucene(15)---lucene搜索之正则表达式查询RegExQuery和手机邮箱查询示例

今天快下班的时候收到了一个群友的问题,大意是读取文本文件中的内容,找出文件中的手机号和邮箱,我自己写了一个读取文档的内容的正则查询示例,用于匹配文件中是否含有邮箱或者手机号,这个等于是对之前的文本处理工具的一个梳理,同时结合lucene内部提供的正则匹配查询RegexQuery: 废话不多说了,直接上代码,这里先对文件内容读取分类处理,分为pdf word excel 和普通文本四类,不同的种类读取文本内容不一样 pdf利用pdfbox读取内容,word和excel利用poi进行读取内容,文本文

一步一步跟我学习lucene(12)---lucene搜索之分组处理group查询

grouping介绍 我们在做lucene搜索的时候,可能会用到对某个条件的数据进行统计,比如统计有多少个省份,在sql查询中我们可以用distinct来完成类似的功能,也可以用group by来对查询的列进行分组查询.在lucene中我们实现类似的功能怎么做呢,比较费时的做法时我们查询出所有的结果,然后对结果里边的省份对应的field查询出来,往set里边放,显然这种做法效率低,不可取:lucene为了解决上述问题,提供了用于分组操作的模块group,group主要用户处理不同lucene中含

一步一步跟我学习lucene(8)---lucene搜索之索引的查询原理和查询工具类示例

昨天我们了解了lucene搜索之IndexSearcher构建过程(http://blog.csdn.net/wuyinggui10000/article/details/45698667),对lucene的IndexSearcher有一个大体的了解,知道了怎么创建IndexSearcher,就要开始学会使用IndexSearcher进行索引的搜索,本节我们学习索引的查询原理和根据其相关原理写索引查询的工具类的编写: IndexSearcher提供了几个常用的方法: IndexSearcher.

使用 Apache Lucene 搜索文本

好东西 下手绝不留情 转自 http://www.ibm.com/developerworks/cn/opensource/os-apache-lucenesearch/ 简介 Lucene 是一个开源.高度可扩展的搜索引擎库,可以从 Apache Software Foundation 获取.您可以将 Lucene 用于商业和开源应用程序.Lucene 强大的 API 主要关注文本索引和搜索.它可以用于为各种应用程序构建搜索功能,比如电子邮件客户端.邮件列表.Web 搜索.数据库搜索等等.Wi

[Hibernate Search] (5) 高级查询 - 过滤,投影和分面

高级查询 在介绍了更多的高级映射功能之后,是时候回顾一下之前介绍过的查询功能了,看看如何借助这些高级的映射功能来使用一些高级的查询功能.本文会通过以下几个方面进行介绍: 如何在不和数据库进行任何交互的前提下,借助Lucene的力量来动态的筛选结果 如何通过使用基于投影(Projection)的查询来获取需要的属性,从而避免与数据库的交互 如何使用分面搜索(Faceted Search)对搜索结果进行划分 如何使用查询时提升(Boosting) 如何给查询设置时间限制 过滤(Filtering)

一步一步跟我学习lucene(13)---lucene搜索之自定义排序的实现原理和编写自己的自定义排序工具

自定义排序说明 我们在做lucene搜索的时候,可能会需要排序功能,虽然lucene内置了多种类型的排序,但是如果在需要先进行某些值的运算然后在排序的时候就有点显得无能为力了: 要做自定义查询,我们就要研究lucene已经实现的排序功能,lucene的所有排序都是要继承FieldComparator,然后重写内部实现,这里以IntComparator为例子来查看其实现: IntComparator相关实现 其类的声明为 public static class IntComparator exte

一步一步跟我学习lucene(7)---lucene搜索之IndexSearcher构建过程

最近一直在写一步一步跟我学习lucene系列(http://blog.csdn.net/wuyinggui10000/article/category/3173543),个人的博客也收到了很多的访问量,谢谢大家的关注,这也是对我个人的一个激励,O(∩_∩)O哈哈~,个人感觉在博客的编写过程中自己收获了很多,我会一直继续下去,在工作的过程中自己也会写出更多类似系列的博客,也算是对自己只是的一种积累: IndexSearcher 搜索引擎的构建分为索引内容和查询索引两个大方面,这里要介绍的是luce