Query是一个接口,它有很多实现类。
QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuery、TermQuery、BooleanQuery等。可以通过Query对象的getClass()方法来查看这个对象到底是哪个实现类。

Lucene已经给我们提供了很多Query查询器,如PhraseQuery,SpanQuery那为什么还要提供QueryParser呢?或者说设计QueryParser的目的是什么?QueryParser的目的就是让你从众多的Query实现类中脱离出来,因为Query实现类太多了,你有时候会茫然了,我到底该使用哪个Query实现类来完成我的查询需求呢,所以Lucene制定了一套Query语法,根据你传入的Query语法字符串帮你把它转换成Query对象,你不用关心底层是使用什么Query实现类。

Query是一个抽象类,它的子孙包括:

TermQuery:最简单的查询

Term就是一个“键”。
Lucene基本原理就是倒排索引,而倒排索引实际上相当于一种哈希。这种哈希需要键,在英语中键是单词,在汉语中键是分词之后的词语(也就是token)。
Term查询的就是包含单个词语的文章。
如果把“我爱中国”作为TermQuery来查询,那么结果很可能为null,因为“我爱中国”不是一个词语,建立索引时,没有把“我爱中国”作为键。

PrefixQuery:已知Term的前缀,查询多个Term

TermQuery只能查询固定的Term,PrefixQuery可以查询多个Term,这些Term的前缀都是相同的。

BooleanQuery:与或搜索

public void add(Query query, boolean required, boolean prohibited);
required表示必须满足query,prohibited表示必须不满足query
二者组合有4中情况:
true,true:不可能出现这种情况
true,false:必须满足
false,true:必须不满足
false,false:满足不满足都可以

由于布尔型的查询是可以嵌套的,因此可以表示多种条件下的组合。不过,如果子句的数目太多,可能会导致查找效率的降低。因此,Lucene给出了一个默认的限制,就是布尔型Query的子句数目不能超过1024。

RangeQuery:在某一范围内搜索

它需要参数begin和end,这两个参数都是Term类型的。

MultiFieldQueryParser:多个域查询

StandardAnalyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser q = new MultiFieldQueryParser(new String[] {"title","tag" }, analyzer);

PhraseQuery:若干个Term顺次连在一起

这些个Term是近似连续的。
可以设置slop参数来放松限制,slop表示的是编辑距离。

PrefixPhraseQuery

FuzzyQuery

只能模糊化查询一个Term

WildcardQuery:通配符查询

SpanQuery:包含单词位置信息的查询

SpanQuery是一个抽象类,它包含了单词的位置信息、长度信息。
由SpanQuery衍生出的一系列Query:
SpanTermQuery:词距查询的基础,结果和TermQuery相似,只不过是增加了查询结果中单词的距离信息。
SpanFirstQuery:在指定距离可以找到第一个单词的查询。
SpanNearQuery:查询的几个语句之间保持者一定的距离。
SpanOrQuery:同时查询几个词句查询。
SpanNotQuery:从一个词距查询结果中,去除一个词距查询。

SpanQuery位于search.span包下

转载于:https://www.cnblogs.com/weiyinfu/p/6540155.html

理解Lucene中的Query相关推荐

  1. 理解Lucene中的Analyzer

    学习一个库,最好去官网.因为很多库API变动十分大,从博客上找的教程都过时了. Lucene原理就是简简单单的"索引",以空间换时间.但是Lucene将这件事做到了极致,后人再有想 ...

  2. 理解Lucene索引与搜索过程中的核心类

    理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWriter ...

  3. 搜索中的 Query 理解及应用

    文章作者:Joelchen 腾讯 研究员 编辑整理:Hoh 内容来源:腾讯技术工程 出品平台:DataFunTalk 注:转载请联系原作者. 导读:Query 理解 ( QU,Query Unders ...

  4. 浅谈Lucene中的DocValues

    2019独角兽企业重金招聘Python工程师标准>>> 前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticse ...

  5. Lucene 中的Tokenizer, TokenFilter学习

    https://brandnewuser.iteye.com/blog/2305140 lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用 ...

  6. 最新进展概述:澄清式提问辅助理解信息检索中的用户意图

    ©PaperWeekly 原创 · 作者|金金 单位|阿里巴巴研究实习生 研究方向|推荐系统 用户使用搜索引擎的过程中,通常很难用单一的查询表达复杂的信息需求.在真实应用的过程中,用户需要根据当前搜索 ...

  7. Apache Lucene中的并发查询执行

    Apache Lucene是一个出色的并发纯Java搜索引擎,如果您愿意,它可以轻松地使服务器上的可用CPU或IO资源饱和. "典型" Lucene应用程序的并发模型在搜索时每个查 ...

  8. lucene中的nrt

    NRT原理 When you ask for the IndexReader from the IndexWriter, the IndexWriter will be flushed (docs a ...

  9. Lucene中的一些基本概念

    译自http://www.lucenetutorial.com/basic-concepts.html. 基本原理 Lucene是一个java全文检索引擎库,方便我们在应用或是网站中加入检索功能. L ...

最新文章

  1. 成功解决ValueError: DataFrame.dtypes for data must be int, float or bool.Did not expect the data types
  2. suzhou jinjihu lake half round marathon
  3. Nhibernate配置和访问数据问题
  4. 50 jQuery绑定事件 阻止默认事件发生 内置动画 each data
  5. maven install 错误
  6. Spark算子:RDD键值转换操作(5)–leftOuterJoin、rightOuterJoin、subtractByKey
  7. 2018年度总结 - 黑子
  8. sscom串口调试助手
  9. k3c路由怎么设置虚拟服务器,搭建ngrok服务器!!给k3.k3c.K2.k2p路由器使用!!详细教程!!!...
  10. 408计算机考研题型分布,计算机考研:计算机408大纲考点变化解析指导
  11. (亲测可用)基于matlab的用自写函数来实现图像的灰度处理sobel canny算子边缘检测
  12. 浅谈对POW的认识和理解
  13. excel组合汇总_Excel汇总20151102
  14. 中国临沂白沙埠第四届洋葱文化节开幕
  15. 阻尼效果总结(顶部图片放大效果)
  16. 华为云ECS服务器中通过docker部署jenkins
  17. python按照号段生成手机号接收验证码,「 python 」 python 实现短信验证码
  18. 消息 ByteBuf 详解
  19. SecureCRT 64位安装与破解
  20. 2022优秀作文范文

热门文章

  1. AbstractQueuedSynchronizer AQS源码分析
  2. $《第一行代码:Android》读书笔记——第6章 数据持久化
  3. SQL Server 日期转换格式
  4. 【南邮操作系统实验】银行家算法Java版
  5. js的if(!myFunction())有何用
  6. 渗透工具—反制爬虫之Burp Suite RCE
  7. 【网络安全工程师面试合集】——什么是IP安全 IPsec
  8. linux系统下tar打包压缩命令的使用总结
  9. [转]OpenCV学习笔记大集锦
  10. 决策树之C4.5(详细版终结版)