博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解Lucene中的Query
阅读量:6850 次
发布时间:2019-06-26

本文共 1685 字,大约阅读时间需要 5 分钟。

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是一个抽象类,它的子孙包括:

695653-20170315142402541-1420857510.png

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

695653-20170315143011901-1445971294.png

转载地址:http://torul.baihongyu.com/

你可能感兴趣的文章
C#泛型列表List<T>基本用法总结
查看>>
《UNIX环境高级编程》单个源码编译方法
查看>>
追涨必须具备的四个条件
查看>>
最大存款方式
查看>>
GridView删除时激发了未处理的事件“RowDeleting"
查看>>
ZOJ 3213 Beautiful Meadow
查看>>
什么是聚合根
查看>>
机器学习&数据挖掘笔记_17(PGM练习一:贝叶斯网络基本操作)
查看>>
图像旋转
查看>>
css两列等高布局
查看>>
PHP适合做大型网站吗?
查看>>
lua入门之二:c/c++ 调用lua及多个函数返回值的获取
查看>>
C使用FILE指针文件操作
查看>>
cobbler pxe-menu
查看>>
openssl 非对称加密 RSA 加密解密以及签名验证签名
查看>>
MyBatis Generator生成DAO——序列化
查看>>
算法笔记_175:历届试题 蚂蚁感冒(Java)
查看>>
pdb文件是什么
查看>>
.Net 跳转
查看>>
vim搭建笔记
查看>>