lucnen核心之查询

lucnen核心之查询

一、基础查询 Search Basics

  lucene提供了很多的Query查询,这些查询大部分在org.apache.lucene.search这个包下,一部分在spans和queries模块下,这些实现可以进行多种组合,以此来实现复杂的查询功能。在下面第二部分查询类中,着重说明了几个更重要的查询类。在自定义查询部分,有更多的关于自定义你自己的查询类的说明。

  执行查询时,我们需要调用的IndexSearcher的search方法:

  IndexSearcher.search(Query,int)

  一旦一个查询被创建并且被以参数的形式传给了IndexSearcher,就会对查询的结果进行打分,经过一些基础配置的设置之后,控制权将会被传递给Weight实现及其Scorer或者BulkScore实例。在下面算法部分将会有更多的解释。

二、查询类

1、TermQuery

  在众多的Query实现中,TermQuery是最易理解也是在程序中最为常用的。TermQuery匹配包含指定Term的所有文档。一个Term是一个包含在特定的字段中的一个单词。因此,一个TermQuery会获取,包含Term指定的字段中的字符串(或者说单词)的文档,并对这些文档计算分数。构造一个TermQuery的方法如下:

  TermQuery tq = new TermQuery(new Term("fieldName","term"));

  在这个例子中,查询所有在fieldName字段中含有term这个单词的文档。

2、BooleanQuery

  当你将多个TermQuery实例结合起来放到BooleanQuery中使用,就会发生非常有趣的事情。一个BooleanQuery中包含多个BooleanClause。每一个子句中包含一个子查询(查询实例)和一个操作符(来自于BooleanClause.Occur)用于描述子查询如何与其它的子句结合起来。下面介绍一下BooleanClause中的操作符。

MUST 这个操作符用于子句的关键词需要搜索结果中的所有文档都包含。

MUST NOT 这个操作符用于子句的关键词不能出现在搜索结果里的所有文档中。

SHOULD 这个操作符用于子句中的关键词可以出现在搜索结果里的文档中,但这个关键词不是必须的。

FILTER 这个操作符的作用与MUST相同,唯一的区别是这个子句中匹配的结果不参与分数的计算。

构造一个布尔查询需要添加两个以上的BooleanClause实例。但是,如果添加了过多的子句(即BooleanClause),在查询时会抛出TooManyClauses异常。这种情况通常出现在将一个Query重写为包含许多TermQuery子句的BooleanQuery时。默认的可包含的子句的最大数量是1024个,但是,这个值可以通过BooleanQuery.setMaxClauseCount(int)方法改变。

example:

	BooleanQuery.Builder builder = new BooleanQuery.Builder();
    builder.add(new TermQuery(new Term("contents","美国")), BooleanClause.Occur.MUST);
	builder.add(new TermQuery(new Term("contents","中国")), BooleanClause.Occur.MUST_NOT);

3、phrase(短语查询)

  另外一部分查询是关于短语的,去查询文档是否包含指定的需要查询的单词,这部分被称为短语查询。主要有三种不同的处理方式:

 [1]、PhraseQuery——匹配一系列的Term</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值