理解Lucene中的Query
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相关推荐
- 理解Lucene中的Analyzer
学习一个库,最好去官网.因为很多库API变动十分大,从博客上找的教程都过时了. Lucene原理就是简简单单的"索引",以空间换时间.但是Lucene将这件事做到了极致,后人再有想 ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWriter ...
- 搜索中的 Query 理解及应用
文章作者:Joelchen 腾讯 研究员 编辑整理:Hoh 内容来源:腾讯技术工程 出品平台:DataFunTalk 注:转载请联系原作者. 导读:Query 理解 ( QU,Query Unders ...
- 浅谈Lucene中的DocValues
2019独角兽企业重金招聘Python工程师标准>>> 前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticse ...
- Lucene 中的Tokenizer, TokenFilter学习
https://brandnewuser.iteye.com/blog/2305140 lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用 ...
- 最新进展概述:澄清式提问辅助理解信息检索中的用户意图
©PaperWeekly 原创 · 作者|金金 单位|阿里巴巴研究实习生 研究方向|推荐系统 用户使用搜索引擎的过程中,通常很难用单一的查询表达复杂的信息需求.在真实应用的过程中,用户需要根据当前搜索 ...
- Apache Lucene中的并发查询执行
Apache Lucene是一个出色的并发纯Java搜索引擎,如果您愿意,它可以轻松地使服务器上的可用CPU或IO资源饱和. "典型" Lucene应用程序的并发模型在搜索时每个查 ...
- lucene中的nrt
NRT原理 When you ask for the IndexReader from the IndexWriter, the IndexWriter will be flushed (docs a ...
- Lucene中的一些基本概念
译自http://www.lucenetutorial.com/basic-concepts.html. 基本原理 Lucene是一个java全文检索引擎库,方便我们在应用或是网站中加入检索功能. L ...
最新文章
- 成功解决ValueError: DataFrame.dtypes for data must be int, float or bool.Did not expect the data types
- suzhou jinjihu lake half round marathon
- Nhibernate配置和访问数据问题
- 50 jQuery绑定事件 阻止默认事件发生 内置动画 each data
- maven install 错误
- Spark算子:RDD键值转换操作(5)–leftOuterJoin、rightOuterJoin、subtractByKey
- 2018年度总结 - 黑子
- sscom串口调试助手
- k3c路由怎么设置虚拟服务器,搭建ngrok服务器!!给k3.k3c.K2.k2p路由器使用!!详细教程!!!...
- 408计算机考研题型分布,计算机考研:计算机408大纲考点变化解析指导
- (亲测可用)基于matlab的用自写函数来实现图像的灰度处理sobel canny算子边缘检测
- 浅谈对POW的认识和理解
- excel组合汇总_Excel汇总20151102
- 中国临沂白沙埠第四届洋葱文化节开幕
- 阻尼效果总结(顶部图片放大效果)
- 华为云ECS服务器中通过docker部署jenkins
- python按照号段生成手机号接收验证码,「 python 」 python 实现短信验证码
- 消息 ByteBuf 详解
- SecureCRT 64位安装与破解
- 2022优秀作文范文