全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Lucene实现多种高级搜索形式

布尔操作符

大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 AND, OR, NOT。Lucene 支持 5种布尔操作符,分别是 AND, OR, NOT, 加(+), 减(-)。接下来我会讲述每个操作符的用法。

OR: 如果你要搜索含有字符 A 或者 B 的文档,那么就需要使用 OR操作符。需要记住的是,如果你只是简单的用空格将两个关键词分割开,其实在搜索的时候搜索引擎会自动在两个关键词之间加上 OR操作符。例如,“Java OR Lucene” 和 “Java Lucene” 都是搜索含有 Java 或者含有 Lucene的文档。

AND: 如果你需要搜索包含一个以上关键词的文档,那么就需要使用 AND 操作符。例如,“Java AND Lucene”返回所有既包含 Java 又包含 Lucene 的文档。

NOT: Not 操作符使得包含紧跟在 NOT 后面的关键词的文档不会被返回。例如,如果你想搜索所有含有 Java 但不含有Lucene 的文档,你可以使用查询语句 “Java NOT Lucene”。但是你不能只对一个搜索词使用这个操作符,比如,查询语句“NOT Java” 不会返回任何结果。

加号(+): 这个操作符的作用和 AND 差不多,但它只对紧跟着它的一个搜索词起作用。例如,如果你想搜索一定包含Java,但不一定包含 Lucene 的文档,就可以使用查询语句“+Java Lucene”。

减号(-): 这个操作符的功能和 NOT 一样,查询语句 “Java -Lucene” 返回所有包含 Java 但不包含Lucene 的文档。

接下来我们看一下如何利用 Lucene 提供的 API 来实现布尔查询。清单1 显示了如果利用布尔操作符进行查询的过程。

清单1:使用布尔操作符

//Test boolean operator
public void testOperator(String indexDirectory) throwsException{
Directory dir =FSDirectory.getDirectory(indexDirectory,false);
IndexSearcher indexSearcher = new IndexSearcher(dir);
String[] searchWords = {"Java AND Lucene", "Java NOT Lucene", "JavaOR 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]);}<p></p>
<p></p>

域搜索(Field Search)

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

清单2:实现域搜索

<p>//Test field search
public void testFieldSearch(String indexDirectory) throwsException{
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);</p>
<p></p>

通配符搜索(Wildcard Search)

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

清单3:进行通配符查询

<p>//Test wildcard search
public void testWildcardSearch(String indexDirectory)throwsException{
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]);}</p>
<p></p>

模糊查询

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

清单4:实现模糊查询

<p>//Test fuzzy search
public void testFuzzySearch(String indexDirectory)throwsException{
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]);}</p>
<p></p>

范围搜索(Range Search)

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

清单5:测试范围搜索

<p>//Test range search
public void testRangeSearch(String indexDirectory)throwsException{
Directory dir =FSDirectory.getDirectory(indexDirectory,false);
IndexSearcher indexSearcher = new IndexSearcher(dir);
Term begin = new Term("birthDay","20000101");
Term end = newTerm("birthDay","20060606");
Query query = new RangeQuery(begin,end,true);
Hits results = indexSearcher.search(query);
System.out.println(results.length() + "search results isreturned");
}</p>

以上所述是小编给大家介绍的Lucene实现多种高级搜索形式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# lucene高级搜索  # 使用Lucene实现一个简单的布尔搜索功能  # Lucene.Net实现搜索结果分类统计功能(中小型网站)  # Java实现lucene搜索功能的方法(推荐)  # 基于Lucene的Java搜索服务器Elasticsearch安装使用教程  # 使用Java的Lucene搜索工具对检索结果进行分组和分页  # 使用Lucene.NET实现站内搜索  # 基于ASP.NET的lucene.net全文搜索实现步骤  # 关键词  # 文档  # 布尔  # 你可以  # 你想  # 你就  # 可以使用  # 如果你  # 但不  # 来实现  # 多字  # 只对  # 小编  # 的是  # 都是  # 是在  # 我会  # 你要  # 在此  # 两种 


相关文章: 建站之星如何实现五合一智能建站与营销推广?  如何选择可靠的免备案建站服务器?  制作企业网站建设方案,怎样建设一个公司网站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  网页设计网站制作软件,microsoft office哪个可以创建网页?  建站之星后台管理:高效配置与模板优化提升用户体验  制作公司内部网站有哪些,内网如何建网站?  Android滚轮选择时间控件使用详解  ppt制作免费网站有哪些,ppt模板免费下载网站?  公司网站的制作公司,企业网站制作基本流程有哪些?  MySQL查询结果复制到新表的方法(更新、插入)  如何注册花生壳免费域名并搭建个人网站?  c# 服务器GC和工作站GC的区别和设置  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  北京制作网站的公司,北京铁路集团官方网站?  浅谈Javascript中的Label语句  如何通过商城自助建站源码实现零基础高效建站?  济南专业网站制作公司,济南信息工程学校怎么样?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  javascript中的try catch异常捕获机制用法分析  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  高端企业智能建站程序:SEO优化与响应式模板定制开发  网站app免费制作软件,能免费看各大网站视频的手机app?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  网站制作的步骤包括,正确网址格式怎么写?  建站之星导航如何优化提升用户体验?  内网网站制作软件,内网的网站如何发布到外网?  制作销售网站教学视频,销售网站有哪些?  如何通过西部建站助手安装IIS服务器?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站主机如何选?性能与价格怎样平衡?  ,石家庄四十八中学官网?  如何高效生成建站之星成品网站源码?  建站之星上传入口如何快速找到?  如何在阿里云虚拟主机上快速搭建个人网站?  Python多线程使用规范_线程安全解析【教程】  建站之星如何快速生成多端适配网站?  网站制作模板下载什么软件,ppt模板免费下载网站?  盐城做公司网站,江苏电子版退休证办理流程?  制作电商网页,电商供应链怎么做?  建站VPS推荐:2025年高性能服务器配置指南  建站之星安装需要哪些步骤及注意事项?  常州企业网站制作公司,全国继续教育网怎么登录?  Python如何创建带属性的XML节点  江苏网站制作公司有哪些,江苏书法考级官方网站?  ,南京靠谱的征婚网站?  如何自定义建站之星网站的导航菜单样式? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。