第一、按词条搜索 - TermQuery

query = new TermQuery(new Term("name","word1"));
hits = searcher.search(query);

这样就可以把 field 为 name 的所有包含 word1 的文档检索出来了。

第二、“与或”搜索 - BooleanQuery

它实际是一个组合 query 看看下面的代码:

query1 = new TermQuery(new Term("name","word1"));
query2 = new TermQuery(new Term("name","word2"));
BooleanQuery query=new BooleanQuery();
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.MUST);
hits = searcher.search(query);

其中的MUST、SHOULD、MUST_NOT表示与、或、非 ,从字面意思很容易理解
Lucene 可以最多支持连续 1024 的 query 的组合。

第三、 在某一范围内搜索 - RangeQuery

IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
Term beginTime = new Term("time","200001");
Term endTime = new Term("time","200005");
Hits hits = null;
RangeQuery query = null;
query = new RangeQuery(beginTime, endTime, false);
hits = searcher.search(query);

RangeQuery 的构造函数的参数分别代表起始、结束、是否包括边界。这样我们就可以按照要求检索了。

第四、 使用前缀检索 - PrefixQuery

这个检索的机制有点类似于 indexOf() 从前缀查找。这个常在英文中使用,中文中就很少使用了。代码如下:

IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
Term pre1 = new Term("name", "Da");
query = new PrefixQuery(pre1);
hits = searcher.search(query);

第五、 多关键字的搜索 - PhraseQuery

可以多个关键字同时查询。使用如下:

query = new PhraseQuery();
query.add(word1);
query.add(word2);
query.setSlop(0);
hits = searcher.search(query);
printResult(hits, "'david' 与 'mary' 紧紧相隔的 Document");
query.setSlop(2);
hits = searcher.search(query);
printResult(hits, "'david' 与 'mary' 中相隔两个词的短语 ");

这里我们要注意 query.setSlop(); 这个方法的含义。 
query.setSlop(0); 紧紧相连 (这个的条件比较苛刻) 
query.setSlop(2); 相隔。

第六、 使用短语缀搜索 - PharsePrefixQuery 
使用 PharsePrefixQuery 可以很容易的实现相关短语的检索功能。 
实例:

query = new PhrasePrefixQuery();
// 加入可能的所有不确定的词
Term word1 = new Term("content", "david");
Term word2 = new Term("content", "mary");
Term word3 = new Term("content", "smith");
Term word4 = new Term("content", "robert");
query.add(new Term[]{word1, word2});
// 加入确定的词
query.add(word4);
query.setSlop(2);
hits = searcher.search(query);
printResult(hits, " 存在短语 'david robert' 或 'mary robert' 的文档 ");

第七、 相近词语的搜索 - fuzzyQuery 
可以通俗的说它是一种模糊查询。 
实例:

Term word1 = new Term("content", "david");
Hits hits = null;
FuzzyQuery query = null;
query = new FuzzyQuery(word1);
hits = searcher.search(query);
printResult(hits," 与 'david' 相似的词 ");

第八、 使用通配符搜索 - WildcardQuery 
实例:

IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
Term word1 = new Term("content", "*ever");
Term word2 = new Term("content", "wh?ever");
Term word3 = new Term("content", "h??ever");
Term word4 = new Term("content", "ever*");
WildcardQuery query = null;
Hits hits = null;
query = new WildcardQuery(word1);
hits = searcher.search(query);
printResult(hits, "*ever");
query = new WildcardQuery(word2);
hits = searcher.search(query);
printResult(hits, "wh?ever");
query = new WildcardQuery(word3);
hits = searcher.search(query);
printResult(hits, "h??ever");
query = new WildcardQuery(word4);
hits = searcher.search(query);
printResult(hits, "ever*");

由上可以看出通配符?代便 1 个字符, * 代表 0 到多个字符。

Lucene 现在支持以上八中的搜索方式,我们可以根据需要选择适合自己的搜索方式。当然上面提供的一些可能对英文还是比较有效,中文就不可取了,所以我们开始想想百度,我们只在一个输入框中搜索结果。有了这个疑问我们揭开下一章的讨论吧!

查询字符串的解析:这个就是我们经常在一个输入框中输入我们要检索的文字,交给搜索引擎去帮我们分词。

QueryParser 类就是对查询字符串的解析类。

看看它的用法:

query = QueryParser.parse(key1, "name", new StandardAnalyzer());
hits = searcher.search(query);

它直接返回一个 Query 对象。需要传入的参数分别是: 
用户需要查询的字符串、需要检索的对应字段名称、采用的分词类。

Analyzer analyzer = new CJKAnalyzer();
String[] fields = {"filename", "content"};
Query query = MultiFieldQueryParser.parse(searchword, fields, analyzer);
Hits hits = searcher.search(query);

QueryParser 的“与” 和 “或”: 
QueryParser 之间默认是或,我们想改变为与的话加入以下代码: 
QueryParser.setOperator(QueryParser.DEFAULT_OPERATOR_AND); 
就可以了。

2
0
 

Lucene提供的条件判断查询的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架 ...

  2. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  3. ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)

    ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题:  浏览器安全限制了前端脚本跨站点的访问资源, ...

  4. SpringDataJPA+QueryDSL玩转态动条件/投影查询

    在本文之前,本应当专门有一篇博客讲解SpringDataJPA使用自带的Specification+JpaSpecificationExecutor去说明如何玩条件查询,但是看到新奇.编码更简单易懂的 ...

  5. Linux 条件判断

    1. 按照文件类型判断 -b 文件 #判断文件是否存在,并且是设备文件 -c 文件 #判断文件是否存在,并且是字符设备文件 -d 目录 #判断目录是否存在,并且是否为目录(是目录返回真) -e 文件 ...

  6. 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架

    问题:3行代码 PDF.NET是一个开源的数据开发框架,它的特点是简单.轻量.快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用.但是,PDF.NET比起 ...

  7. python基础-编码_if条件判断

    一.第一句Python代码 在 /home/dev/ 目录下创建 hello.py 文件,内容如下: [root@python-3 scripts]# cat hello.py #!/usr/bin/ ...

  8. oracle触发器加条件判断

    oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...

  9. 【java】spring-data-jpa 集成hibernate实现多条件分页查询

    初次接触spring-data-jpa,实现多条件分页查询. 基础环境 Spring Boot+spring-data-jpa+hibernate+mysql 1.接口 要继承这个接口,这个接口提供了 ...

随机推荐

  1. ReactNative入门 —— 动画篇(上)

    在不使用任何RN动画相关API的时候,我们会想到一种非常粗暴的方式来实现我们希望的动画效果——通过修改state来不断得改变视图上的样式. 我们来个简单的示例: var AwesomeProject ...

  2. Floyd-Warshall 全源最短路径算法

    Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...

  3. 写自己的Socket框架(三)

    在通信写完了以后,应用层接收到Socket抛上来的byte[],这个时候对于实际的写逻辑的开发者来说,这样的数据并不友好,我们就需要在应用层统一一个包的规则(应用层协议),处理完以后,然后再传给实际的 ...

  4. ABP源码分析十八:UI Inputs

    以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...

  5. 原生ajax实现登录(一部分代码)

        <script type="text/javascript">          function ajax() {          //先声明一个异步请求对 ...

  6. Java常量的应用

    所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 语法:final 常量名 = 值; 使用fianl关键字 常量名 值 final String a1 = &qu ...

  7. Android colors资源文件常用的颜色

    <?xml version="1.0" encoding="utf-8"?> <resources> <color name=&q ...

  8. C#设计模式-访问者模式

    一. 访问者(Vistor)模式 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结 ...

  9. Android 捕获异常并在应用崩溃后重启应用

    问题概述: 在Android应用开发中,偶尔会因为测试的不充分导致一些异常没有被捕获,这时应用会出现异常并强制关闭,这样会导致很不好的用户体验,为了解决这个问题,我们需要捕获相关的异常并做处理. 首先 ...

  10. 解析大型.NET ERP系统 权限模块设计与实现

    权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...