Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索
Lucene 的四大索引查询
清单1:使用布尔操作符

- //Test boolean operator
- blic void testOperator(String indexDirectory) throws Exception{
- Directory dir = FSDirectory.getDirectory(indexDirectory,false);
- IndexSearcher indexSearcher = new IndexSearcher(dir);
- String[] searchWords = {"Java AND Lucene", "Java NOT Lucene", "Java OR Lucene",
- "+Java +Lucene", "+Java -Lucene"};
- Analyzer language = new StandardAnalyzer();
- Query query;
- for(int i = 0; i < searchWords.length; i++){
- query = QueryParser.parse(searchWords[i], "title", language);
- Hits results = indexSearcher.search(query);
- System.out.println(results.length() + "search results for query " + searchWords[i]);
- }
域搜索(Field Search)
Lucene 支持域搜索,你可以指定一次查询是在哪些域(Field)上进行。例如,如果索引的文档包含两个域,Title 和 Content,你就可以使用查询 “Title: Lucene AND Content: Java” 来返回所有在 Title 域上包含 Lucene 并且在 Content 域上包含 Java 的文档。清单 2 显示了如何利用 Lucene 的 API 来实现域搜索。
清单2:实现域搜索

- //Test field search
- public void testFieldSearch(String indexDirectory) throws Exception{
- Directory dir = FSDirectory.getDirectory(indexDirectory,false);
- IndexSearcher indexSearcher = new IndexSearcher(dir);
- String searchWords = "title:Lucene AND content:Java";
- Analyzer language = new StandardAnalyzer();
- Query query = QueryParser.parse(searchWords, "title", language);
- Hits results = indexSearcher.search(query);
- System.out.println(results.length() + "search results for query " + searchWords);
- }
通配符搜索(Wildcard Search)
Lucene 支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索 tiny 或者 tony,你就可以使用查询语句 “t?ny”;如果你想查询 Teach, Teacher 和 Teaching,你就可以使用查询语句 “Teach*”。清单3 显示了通配符查询的过程。
清单3:进行通配符查询

- //Test wildcard search
- public void testWildcardSearch(String indexDirectory)throws Exception{
- Directory dir = FSDirectory.getDirectory(indexDirectory,false);
- IndexSearcher indexSearcher = new IndexSearcher(dir);
- String[] searchWords = {"tex*", "tex?", "?ex*"};
- Query query;
- for(int i = 0; i < searchWords.length; i++){
- query = new WildcardQuery(new Term("title",searchWords[i]));
- Hits results = indexSearcher.search(query);
- System.out.println(results.length() + "search results for query " + searchWords[i]);
- }
- }
模糊查询
Lucene 提供的模糊查询基于编辑距离算法(Edit distance algorithm)。你可以在搜索词的尾部加上字符 ~ 来进行模糊查询。例如,查询语句 “think~” 返回所有包含和 think 类似的关键词的文档。清单 4 显示了如果利用 Lucene 的 API 进行模糊查询的代码。
清单4:实现模糊查询

- //Test fuzzy search
- public void testFuzzySearch(String indexDirectory)throws Exception{
- Directory dir = FSDirectory.getDirectory(indexDirectory,false);
- IndexSearcher indexSearcher = new IndexSearcher(dir);
- String[] searchWords = {"text", "funny"};
- Query query;
- for(int i = 0; i < searchWords.length; i++){
- query = new FuzzyQuery(new Term("title",searchWords[i]));
- Hits results = indexSearcher.search(query);
- System.out.println(results.length() + "search results for query " + searchWords[i]);
- }
- }
范围搜索(Range Search)
范围搜索匹配某个域上的值在一定范围的文档。例如,查询 “age:[18 TO 35]” 返回所有 age 域上的值在 18 到 35 之间的文档。清单5显示了利用 Lucene 的 API 进行返回搜索的过程。
清单5:测试范围搜索

- //Test range search
- public void testRangeSearch(String indexDirectory)throws Exception{
- Directory dir = FSDirectory.getDirectory(indexDirectory,false);
- IndexSearcher indexSearcher = new IndexSearcher(dir);
- Term begin = new Term("birthDay","20000101");
- Term end = new Term("birthDay","20060606");
- Query query = new RangeQuery(begin,end,true);
- Hits results = indexSearcher.search(query);
- System.out.println(results.length() + "search results is returned");
- }
Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索的更多相关文章
- 搜索引擎系列 ---lucene简介 创建索引和搜索初步
一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子 ...
- lucene简介 创建索引和搜索初步
lucene简介 创建索引和搜索初步 一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引 ...
- Lucene第二讲——索引与搜索
一.Feild域 1.Field域的属性 是否分词:Tokenized 是:对该field存储的内容进行分词,分词的目的,就是为了索引. 否:不需要对field存储的内容进行分词,不分词,不代表不索引 ...
- Lucene的数值索引以及范围查询
对文本搜索引擎的倒排索引(数据结构和算法).评分系统.分词系统都清楚掌握之后,本人对数值索引和搜索一直有很大的兴趣,最近对Lucene对数值索引和范围搜索做了些学习,并将主要内容整理如下: 1. Lu ...
- lucene复合条件查询案例——查询name域 或 description域 包含lucene关键字的两种方式
方式一:使用语法表达式查询 //查询name域 或 description域包含lucene关键字 QueryParser queryParser = new QueryParser("na ...
- Lucene.Net 优化索引生成,即搜索显示优化
最近发现站内搜索引擎响应速度很慢,因为刚来公司之前技术员跑了源码什么的都没留下.只好自己手动破解源代码dll查找问题所在! 这个问题代码就暂时不贴了这里只写思路 原逻辑:经过整体分析后发现之前是使用 ...
- lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)
lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能) 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...
- Lucene 06 - 使用Lucene的Query API查询数据
目录 1 Query对象的创建(方式一): 使用子类对象 1.1 常用的Query子类对象 1.2 常用的Query子类对象使用 1.2.1 使用TermQuery 1.2.2 使用NumericRa ...
- lucene&solr学习——索引维护
1.索引库的维护 索引库删除 (1) 全删除 第一步:先对文档进行分析 public IndexWriter getIndexWriter() throws Exception { // 第一步:创建 ...
随机推荐
- 玩转css样式选择器----当父元素有多个子元素时选中第一个
- springmvc中ajax处理
1.使用HttpServletResponse处理--不需要配置解析器 @Controller public class AjaxController { @RequestMapping(" ...
- BZOJ——1649: [Usaco2006 Dec]Cow Roller Coaster
http://www.lydsy.com/JudgeOnline/problem.php?id=1649 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 7 ...
- Spring 详解(三)------- SpringMVC拦截器使用
目录 不拦截静态资源 使用拦截器 拦截器使用测试 SimpleMappingExceptionResolver 拦截异常 不拦截静态资源 如果配置拦截类似于*.do格式的拦截规则,则对静态资源的访问是 ...
- TFS2018 获取所有Build变量及变量值
添加一个Command Line 步骤,Tool设置为 cmd ,并设置参数为 /k set 注意:若在执行时出现如下报错信息,Tool的值改成 cmd.exe --20T02::.0416435Z ...
- centos6.5编译安装gearmand Job Server(C)
1)下载安装包: wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz 2)安装编译器: yu ...
- 关于android分享(sharedsdk的简单使用)
老早就使用了.可是如今才写,惰性太大,如今改 如今做产品的话相信大家基本都做分享吧.一个是项目的需求须要,另一个是能够非常好的宣传自己的产品.其它的优点依据情况而论 事实上每一个平台都有它自己的文档, ...
- Android中查看服务是否开启的工具类
这个也是昨天学习的,做下总结. 检查服务是否开启要写成一个工具类,方便使用,传服务的名字返回Boolean值,当然,由于须要,还要传一个上下文context. 说一下这个工具类的几个关键点: 1.方法 ...
- 紫书p199 八数码(BFS,hash)
八数码问题 紫书上的简单搜索 渣渣好久才弄懂 #include<cstdio> #include<cstring> using namespace std; const i ...
- 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
十六进制数相等的推断 请问例如以下程序的输出是神马? #include <iostream> #include <string> using namespace std; in ...