Lucene搜索的时候就要构造查询语句,本篇就介绍下各种Query。IndexSearcher是搜索主类,提供的常用查询接口有:

TopDocs search(Query query, int n);//find the top n hits for query
TopDocs search(Query query, Filter filter, int n);// find the top n hits for query, applying filter if no-null

Query

quey在org.apache.lucene.search上,代表最终的查询语法树,传入IndexSearcher进行查找。

TermQuery:在某个Field上查找一个词条

Term t = new Term("bookname", "Lucene");//词条所在Field,词条内容
Query q = new TermQuery(t);

BooleanQuery:由多个子句组成,子句间由“与、或、非”这样的布尔逻辑连接。BooleanClause.Occur是个枚举,包括MUST/MUST_NOT/SHOULD。常用的组合有:

MUST和MUST:求交集,MUST和MUST_NOT:求差集,SHOULD和SHOULD:求并集。

void add(Query query, BooleanClause.Occur occur)

NumericRangeQuery/TermRangeQuery:范围查询,范围可以是日期、时间、数字,如果不设上限或下限,对应的边界设为null,inclusive设为false。

TermRangeQuery(String field, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
//NumericRangeQuery
static NumericRangeQuery<Double> newDoubleRange(String field, Double min, Double max, boolean minInclusive, boolean maxInclusive);
static NumericRangeQuery<Float> newFloatRange(String field, Float min, Float max, boolean minInclusive, boolean maxInclusive);
static NumericRangeQuery<Integer> newIntRange(String field, Integer min, Integer max, boolean minInclusive, boolean maxInclusive);
static NumericRangeQuery<integer> newIntRange(String field, int precisionStep, Integer min, Integer max, boolean minInclusive, boolean maxInclusive);

PhraseQuery:短语搜索,一个以上的关键字组成的短语,如中国,钢铁。可以设置slop,允许短语中的字之间有其他字的个数,默认为0

void add(Term term);//add a term to the end of the query phrase
void setSlop(int s);//set the number of other words between words in the query phrase
//sample,bookname包含"中国"的会被搜到,其他组合都不会被搜到
PhraseQuery query = new PhraseQuery();
query.add(new Term("bookname", "中"));
query.add(new Term("bookname", "国"));

MultiPhraseQuery:一些短语有相同的前缀,或后缀,或中间词,如中国好声音和美国好声音

void	add(Term term);//Add a single term at the next position in the phrase.
void add(Term[] terms);//Add multiple terms at the next position in the phrase.
//sample
MultiPhraseQuery query = new MultiPhraseQuery();
query.add(new Term[]{new Term("bookname", "中"), new Term("bookname", "美")});
query.add(new Term("song", "国"));
query.add(new Term("song", "好"));
query.add(new Term("song", "声"));
query.add(new Term("song", "音"));

PrefixQuery:前缀匹配

PrefixQuery query = new PrefixQuery(new Term("bookname","钢"));//查找以钢开头的bookname

FuzzyQuery:模糊匹配,比较两个字符串时,执行一个串转变为另一个串的操作(增、删、改变字母),每执行一次转变就扣除一定分数,最终得到两者的距离(模糊度)

FuzzyQuery(Term term);
FuzzyQuery(Term term, int maxEdits);//maxEdits-an edit distance fo at most maxEdits to term
FuzzyQuery(Term term, int maxEdits, int prefixLength);//prefixLength-length of common (no-fuzzy) prefix

WildcardQuery:使用'?'和'*'通配符

WildcardQuery query = new WildcardQuery(new Term("bookname", "?o*")); 

Filter

filter相当于是一个搜索必须条件,用于对搜索结果进行限制,如返回的文档安全级别限制。所有过滤器都继承org.apache.lucene.search.Filter,因为Filter条件大多与query无关,不需要每次都执行一次索引遍历,所以lucene引入了缓存技术,避免一遍遍重复的搜索索引过滤文档。

常用的有NumericRangeFilter、PrefixFilter、TermRangeFilter,封装Filter以实现缓存的CachingWrapperFilter,针对某个Field进行缓存的FieldCacheRangeFilter、FieldCacheTermsFilter。

QueryParser

org.apache.lucene.queryParser用于解析子句生成Query。支持的语法规则如下

Query  ::= ( Clause )*
Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" )

+ 必须,- 排除,: 表示针对某个Field搜索,通配符?*。举例

+bookname:java -bookname:structs,搜bookname中包含java不包含structs的doc
publishdate:[1990 TO 1998],初版日期在1990和1998之间
bookname:work~0.5,模糊查询
bookname:"apache lucene"~5,松散短语查询,bookname必须包含apache和lucene,但两者距离要在5个词内
"God helps",加引号表示不分词,作为完整的一个短语查询
bookname:(java search),空格隔开的多个词需要加括号,否则后面一个词"search"不会被认为是在bookname上的搜索,会认为是default field上的搜索 

常用方法有:

Query parse(String query);
QueryParser(Version matchVersion, String f, Analyzer a)//分词器应该与建索引的分词器保持一致

注:

构造好Query后,想看下实际的查询内容,可以用query.toString()

Lucene系列-搜索的更多相关文章

  1. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  2. lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3

    前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...

  3. lucene全文搜索之二:创建索引器(创建IKAnalyzer分词器和索引目录管理)基于lucene5.5.3

    前言: lucene全文搜索之一中讲解了lucene开发搜索服务的基本结构,本章将会讲解如何创建索引器.管理索引目录和中文分词器的使用. 包括标准分词器,IKAnalyzer分词器以及两种索引目录的创 ...

  4. lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)

    前言:lucene并不是像solr或elastic那样提供现成的.直接部署可用的系统,而是一套jar包,提供了一些常见语言分词.构建索引和创建搜索器等等功能的API,我们常用到的也就是分词器.索引目录 ...

  5. Lucene系列-近实时搜索(1)

    近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...

  6. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  7. [lucene系列笔记1]lucene6的安装与配置(Windows系统)

    lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载 ...

  8. Lucene系列-索引文件

    本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含了存储的文档(document)正排.倒排信息,用于文本搜索. ...

  9. Lucene系列-分析器

    分析器介绍 搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中.分析器负责对文本进行分词.语言处理得到词条,建索引和搜索的时候都需要用到分 ...

随机推荐

  1. 关于window.open()中文传值乱码问题的解决方法

    最近组长叫我做一个把查询出的数据用POI导出Excel的功能,我前台把要查询的字段通过如下传回后台时,发现出现了乱码问题 window.open('user!export?name='+name); ...

  2. MVC 3 IIS7.5 网站发布及IIS配置文件问题处理

    1.环境配置 1) IIS7.5 2)VS2010 完整版 2.配置internet信息服务功能,直接上图,简洁明了. 3.打开VS2010 ,网站发布, 4.IIS网站设置 添加网站, 5-在浏览器 ...

  3. 亲测——pycharm下运行第一个scrapy项目 ©seven_clear

    最近在学习scrapy,就想着用pycharm调试,但不知道怎么弄,从网上搜了很多方法,这里总结一个我试成功了的. 首先当然是安装scrapy,安装教程什么的网上一大堆,这里推荐一个详细的:http: ...

  4. UIImagePickerController在ios10环境一打开就crash的问题

    在之前的系统环境下,UIImagePickerController都可以顺利打开.但是自从手机升级了ios10以后,每次打开相机和照片库都会直接崩溃. 通过google搜索找到StackOverflo ...

  5. Ubuntu 中 不显示WIFI解决方法

    先用有线接到网络,打开终端,执行以下命令sudo apt-get update sudo apt-get install --reinstall bcmwl-kernel-source 执行成功即可看 ...

  6. Hyper-v虚拟机文件VHDX与VHD的格式转换

    今天遇到一个坑,我在本机(windows 10)上创建的CentOS虚拟机作为docker的宿主机,部署了gitlab等容器,准备迁移到服务器上的时候,发现始终无法导入,提示必须通过Hyper-v导出 ...

  7. Titanium系列--对Window和View的一点理解

    1. window相当于一块屏幕,view相当于一个div层.window拥有全屏和模态化属性,view则没有这2个属性. 2. 创建一个window作为我们的APP的屏幕,之后我们将添加其他元素来丰 ...

  8. 使用Xcode6创建EmptyProject

    多年不写文章,今天突然准备好好写一些博客,以记录自己在编程这条道路上的成长,与所学所悟.提起笔来,才发现,自己的语言之匮乏,思虑再三,始觉不顺.也罢,从头开始慢慢训练吧. 自Xcode6更新之后,默认 ...

  9. P 1080 Human Gene Functions

    大概作了一周,终于A了 类似于求最长公共子序列,稍有变形 当前序列 ch1 中字符为 a,序列 ch2 中字符为 b 则有 3 种配对方式: 1. a 与 b 2. a 与 - 3. - 与 b 动态 ...

  10. Linux 常用工具小结:(5) lftp工具使用

    Linux 常用工具小结:(1) lftp工具使用. 这里会按照一些比较常用的功能列出,并举一个具体的例子逐一解释功能. 通常使用ftp过程是登陆ftp,浏览ftp内容,下载ftp文件,或者上传ftp ...