Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索

简介:

Lucene 的四大索引查询  
清单1:使用布尔操作符  

Java代码      收藏代码
  1. //Test boolean operator  
  2. blic void testOperator(String indexDirectory) throws Exception{  
  3.  Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
  4.  IndexSearcher indexSearcher = new IndexSearcher(dir);  
  5.  String[] searchWords = {"Java AND Lucene", "Java NOT Lucene", "Java OR Lucene",   
  6.                   "+Java +Lucene", "+Java -Lucene"};  
  7.  Analyzer language = new StandardAnalyzer();  
  8.  Query query;  
  9.  for(int i = 0; i < searchWords.length; i++){  
  10.     query = QueryParser.parse(searchWords[i], "title", language);  
  11.     Hits results = indexSearcher.search(query);  
  12.     System.out.println(results.length() + "search results for query " + searchWords[i]);  
  13.  }  




域搜索(Field Search)  

Lucene 支持域搜索,你可以指定一次查询是在哪些域(Field)上进行。例如,如果索引的文档包含两个域,Title 和 Content,你就可以使用查询 “Title: Lucene AND Content: Java” 来返回所有在 Title 域上包含 Lucene 并且在 Content 域上包含 Java 的文档。清单 2 显示了如何利用 Lucene 的 API 来实现域搜索。  


清单2:实现域搜索  

Java代码      收藏代码
  1. //Test field search  
  2. public void testFieldSearch(String indexDirectory) throws Exception{  
  3.     Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
  4.     IndexSearcher indexSearcher = new IndexSearcher(dir);  
  5.     String searchWords = "title:Lucene AND content:Java";  
  6.     Analyzer language = new StandardAnalyzer();  
  7.     Query query = QueryParser.parse(searchWords, "title", language);  
  8.     Hits results = indexSearcher.search(query);  
  9.     System.out.println(results.length() + "search results for query " + searchWords);  
  10. }  
  11.    



通配符搜索(Wildcard Search)  

Lucene 支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索 tiny 或者 tony,你就可以使用查询语句 “t?ny”;如果你想查询 Teach, Teacher 和 Teaching,你就可以使用查询语句 “Teach*”。清单3 显示了通配符查询的过程。  


清单3:进行通配符查询  

Java代码      收藏代码
  1. //Test wildcard search  
  2. public void testWildcardSearch(String indexDirectory)throws Exception{  
  3.    Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
  4.    IndexSearcher indexSearcher = new IndexSearcher(dir);  
  5.    String[] searchWords = {"tex*", "tex?", "?ex*"};  
  6.    Query query;  
  7.    for(int i = 0; i < searchWords.length; i++){  
  8.       query = new WildcardQuery(new Term("title",searchWords[i]));  
  9.       Hits results = indexSearcher.search(query);  
  10.       System.out.println(results.length() + "search results for query " + searchWords[i]);  
  11.    }  
  12. }  
  13.    



模糊查询  

Lucene 提供的模糊查询基于编辑距离算法(Edit distance algorithm)。你可以在搜索词的尾部加上字符 ~ 来进行模糊查询。例如,查询语句 “think~” 返回所有包含和 think 类似的关键词的文档。清单 4 显示了如果利用 Lucene 的 API 进行模糊查询的代码。  


清单4:实现模糊查询  

Java代码      收藏代码
  1. //Test fuzzy search  
  2. public void testFuzzySearch(String indexDirectory)throws Exception{  
  3.    Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
  4.    IndexSearcher indexSearcher = new IndexSearcher(dir);  
  5.    String[] searchWords = {"text", "funny"};  
  6.    Query query;  
  7.    for(int i = 0; i < searchWords.length; i++){  
  8.       query = new FuzzyQuery(new Term("title",searchWords[i]));  
  9.       Hits results = indexSearcher.search(query);  
  10.       System.out.println(results.length() + "search results for query " + searchWords[i]);  
  11.    }  
  12. }  
  13.    



范围搜索(Range Search)  

范围搜索匹配某个域上的值在一定范围的文档。例如,查询 “age:[18 TO 35]” 返回所有 age 域上的值在 18 到 35 之间的文档。清单5显示了利用 Lucene 的 API 进行返回搜索的过程。  


清单5:测试范围搜索  

Java代码      收藏代码
  1. //Test range search  
  2. public void testRangeSearch(String indexDirectory)throws Exception{  
  3.     Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
  4.     IndexSearcher indexSearcher = new IndexSearcher(dir);  
  5.     Term begin = new Term("birthDay","20000101");  
  6.     Term end   = new Term("birthDay","20060606");  
  7.     Query query = new RangeQuery(begin,end,true);  
  8.     Hits results = indexSearcher.search(query);  
  9.     System.out.println(results.length() + "search results is returned");  
  10. }  

















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6601943.html ,如需转载请自行联系原作者


相关文章
|
存储 自然语言处理 Java
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
658 0
接口数据多条件搜索(模糊查询)
接口数据多条件搜索(模糊查询)
232 0
|
SQL 索引
白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
301 0
|
SQL Java
白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
526 0
|
SQL JSON 自然语言处理
白话Elasticsearch01- 结构化搜索之使用term query来搜索数据
白话Elasticsearch01- 结构化搜索之使用term query来搜索数据
301 0
|
Linux 数据库
Linunx搜索,查找类
1.Linux find 命令 Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 按文件名查找: 例如:查找服务器上所有名为hello.txt的文件:
137 0
|
存储 小程序
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
1404 0
|
自然语言处理 搜索推荐
内容搜索排序表达式的最佳实践
本文重点介绍&quot;开放搜索&quot;中的排序表达式的配置及特征性函数的应用
5221 0
内容搜索排序表达式的最佳实践
|
索引
艾伟_转载:Lucene.net多字段多索引目录搜索
Lucene.net是目前在.net环境中被普遍使用的全文索引的开源项目,这次在项目的开发中也使用它进行全文索引。在开发过程中碰到一些小问题就是对多字段和多索引目录进行搜索。 1、多字段搜索就是同时要一个以上的字段中的内容进行比较搜索,类似概念在SQL中就是select * from Table where a like '%query%' or b like '%query%'。
877 0
|
SQL 数据库
如何快速搜索SQL数据库数据和对象
原文 如何快速搜索SQL数据库数据和对象 Frequently, developers and DBAs need to search databases for objects or data. If you’d ever searched for a database function tha...
1136 0
下一篇
无影云桌面