理解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包下

理解Lucene中的Query的更多相关文章
- Lucene中的 Query对象
"Lucene中的 Query对象": 检 索前,需要对检索字符串进行分析,这是由queryparser来完成的.为了保证查询的正确性,最好用创建索引文件时同样的分析器. quer ...
- 理解Lucene中的Analyzer
学习一个库,最好去官网.因为很多库API变动十分大,从博客上找的教程都过时了. Lucene原理就是简简单单的"索引",以空间换时间.但是Lucene将这件事做到了极致,后人再有想 ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWr ...
- 基础:从概念理解Lucene的Index(索引)文档模型
转:http://blog.csdn.net/duck_genuine/article/details/6053430 目录(?)[+] Lucene主要有两种文档模型:Document和Fi ...
- 《Lucene in Action 第二版》第4章节 学习总结 -- Lucene中的分析
通过第四章的学习,可以了解lucene的分析过程是怎样的,并且可以学会如何使用lucene内置分析器,以及自定义分析器.下面是具体总结 1. 分析(Analysis)是什么? 在lucene中,分析就 ...
- lucene中Field简析
http://blog.csdn.net/zhaoxiao2008/article/details/14180019 先看一段lucene3代码 Document doc = new Document ...
- 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能
package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...
- lucene 中关于Store.YES 关于Store.NO的解释
总算搞明白 lucene 中关于Store.YES 关于Store.NO的解释了 一直对Lucene Store.YES不太理解,网上多数的说法是存储字段,NO为不存储. 这样的解释有点郁闷:字面意 ...
- 理解oracle中连接和会话
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp44 理解oracle中连接和会话 1. 概念不同:概念不同: 连接是指物 ...
随机推荐
- iOS:UIImageView图像视图控件
UIImageView:图像视图控件: 它是UIView的子类,因此也是视图控件,可以用来显示图像.因为它具有帧动画属性和操作方法,因此可以用来制作动画,其实动画就是很短的时间内,执行显示连续的 ...
- freetds简介、安装、配置及使用介绍
什么是FreeTDS 简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协议 ...
- Android studio 中NameValuePair跟BasicNameValuePair 不能正常导包问题
Android studio 中NameValuePair跟BasicNameValuePair 不能正常导包问题 针对一个post请求,android studio中无法正常导入以下两个包: imp ...
- python 数据处理中的 LabelEncoder 和 OneHotEncoder
One-Hot 编码即独热编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效.这样做的好处主要有:1. 解决了分类器 ...
- AngularJS driective 封装 自动滚动插件
1.ui-smooth-scroll.js文件内容 angular.module('app') .directive('uiSmoothScroll', ['$location', '$anchorS ...
- jQuery的一个关键函数
jQuery.extend = jQuery.fn.extend = function() { // copy reference to target object var target = argu ...
- windows server 2008 远程桌面(授权、普通用户登录)~ .
大家好,因公司上ERP系统,用户端需要远程到服务器,但大家都知道微软默认只有2个,所以没有办法达到我公司的要求. 在网上找了很久也没有找到合适的文章,要不就这里说一点,那里说一点,没有一个全的,还有很 ...
- GridControl 分组排序
方法一:纯代码 this.list.gridControl.ItemsSource = lsItem; this.list.gridControl.GroupBy("GroupTitle&q ...
- SVN-服务器变更,代码变更
1.使用<SVN-如何删除 SVN 文件夹下面的小图标>文章中的方法将svn的关联去掉 2.使用<SVN-服务器搭建>文章中visual studio添加项目到svn服务器的步 ...
- c语言中pthread的理解和使用
在头文件中看到#typedef unsigned long int pthread_t这句话怎么理解,pthread_t是一个什么类型呢? 相当于pthread_t实际是个unsigned long ...