`
san_yun
  • 浏览: 2638562 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

利用 Lucene 实现高级搜索

    博客分类:
  • solr
 
阅读更多

Lucene 支持多种形式的高级搜索,我们在这一部分中会进行探讨,然后我会使用 Lucene 的 API 来演示如何实现这些高级搜索功能。

布尔操作符
大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 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) 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 实现高级搜索

    ### 利用Lucene实现高级搜索的关键知识点 #### Lucene简介 Lucene是Apache软件基金会下的一个开源全文检索库,提供了高性能的文本搜索能力。它不仅适用于网站的搜索功能,还可以用于任何需要文本搜索的应用场景,如...

    lucene 高级搜索项目

    在这个“Lucene 高级搜索项目”中,我们将深入探讨如何利用Lucene实现附件搜索、附件内容搜索以及全文搜索等高级功能。 **1. Lucene 搜索引擎基础** Lucene 的核心工作流程包括索引创建和搜索两部分。首先,我们...

    lucene实现企业搜索实例

    **Lucene实现企业搜索实例** 在企业环境中,高效、精准的搜索能力是至关重要的,它可以帮助员工快速定位信息,提高工作效率。Apache Lucene是一个开源的全文检索库,它提供了强大的文本搜索功能,能够帮助企业构建...

    lucene 实现类似百度搜索

    **Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...

    lucene实现企业产品检索

    **Lucene实现企业产品检索** Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,它为企业构建高效、可扩展的搜索功能提供了强大的支持。在本文中,我们将深入探讨如何使用Lucene来实现一个类似当当网的...

    lucene高级搜索进阶项目_03

    最后,我们将学习如何利用Lucene的更新和删除功能。在动态数据环境中,我们需要知道如何有效地处理文档的增删改,同时保持索引的一致性和完整性。 总的来说,"Lucene高级搜索进阶项目_03"涵盖了从基础概念到高级...

    lucene高级应用

    通过上述高级应用,开发者可以充分利用Lucene的强大功能,构建出满足复杂需求的搜索引擎。无论是优化索引结构,提升查询效率,还是利用高级特性提供更佳的用户体验,Lucene都提供了丰富的工具和策略。在实际项目中,...

    lucene高级搜索进阶项目_04

    《Lucene高级搜索进阶项目_04》 在深入探讨Lucene的高级搜索进阶项目时,我们首先需要理解Lucene的核心概念及其在信息检索中的应用。Lucene是一个高性能、全文本搜索库,它提供了丰富的搜索功能,包括布尔运算、...

    基于lucene的桌面搜索引擎

    **基于Lucene的桌面搜索引擎** 在信息技术飞速发展的今天,数据...利用Lucene的强大功能,不仅可以实现基础的全文搜索,还能进行高级查询,如短语搜索、通配符搜索和近似搜索等,极大地提升了桌面搜索的效率和便利性。

    用lucene实现的简易搜索引擎

    3. 高级搜索:Lucene提供了短语查询、模糊查询、范围查询等高级功能,可以根据需求灵活使用。 4. 排序与过滤:除了基于相关性得分排序外,还可以自定义排序规则。通过Filter机制,可以对搜索结果进行过滤,如按时间...

    lucene3.6 搜索例子

    Lucene的出现,使得开发人员能够轻松地在他们的应用中添加高级搜索功能。作为一个高性能的信息检索库,Lucene主要包含以下组件:索引、搜索、分析和高亮显示。在3.6版本中,它保持了对大量文档高效处理的能力,并且...

    Lucene实现多种高级搜索形式

    在本文中,我们将深入探讨如何使用Apache Lucene这一强大的全文搜索引擎库来实现各种高级搜索形式。Lucene提供了丰富的功能,让开发者能够构建复杂的查询,满足用户的精确搜索需求。 首先,我们要了解布尔操作符。...

    基于LUCENE的搜索引擎的设计与实现源代码

    《基于LUCENE的搜索引擎设计与实现》 搜索引擎是互联网信息时代的重要工具,它使得海量数据的检索变得...通过学习和实践,我们可以利用LUCENE的强大功能,构建出高效、智能的搜索引擎,满足各种场景下的信息检索需求。

    lucene高级搜索进阶项目_02

    《Lucene高级搜索进阶项目_02》 在深入探讨Lucene的高级搜索进阶项目之前,我们先来理解一下Lucene的核心概念。Lucene是Apache软件基金会的一个开源全文检索库,它提供了高效的文本搜索引擎功能。这个项目_02显然是...

    Lucene+Nutch搜索引擎开发.王学松源代码

    王学松老师的源代码提供了丰富的示例,涵盖了Lucene和Nutch的各个方面,包括如何配置和运行Nutch爬虫,如何自定义分词器,以及如何利用Lucene进行高效检索。通过学习这些源代码,开发者可以: 1. 学习Nutch的配置与...

    lucene高级搜索进阶项目_01

    1. ** autocomplete**:利用Lucene的PrefixQuery或FuzzyQuery实现自动补全功能。 2. ** faceted search**:通过分类或属性过滤,使用户能更精确地导航搜索结果。 3. ** spell checking**:使用SpellChecker组件检查...

    lucene实现站内检索

    本文将深入探讨如何利用Lucene来构建一个站内检索系统,特别关注其索引和搜索功能,以及如何通过优化提高检索效率。 首先,我们需要了解Lucene的基本工作原理。Lucene通过建立倒排索引来实现全文检索。倒排索引是一...

    C#调用Lucene方法-实现快速搜索

    本篇文章将详细探讨如何在C#环境下利用Lucene实现快速搜索。 首先,让我们了解Lucene的基本概念。Lucene是一个开源的Java库,提供了索引和搜索文本的高级工具。它能够对文本进行分词,建立倒排索引,并支持布尔查询...

    lucene.net及.net爬虫实现的简单搜索引擎

    Lucene.NET提供了强大的文本分析、索引和搜索功能,使得开发者可以轻松地在应用程序中集成高级搜索功能。其核心特性包括分词、评分、过滤和排序等,支持多种数据源的索引,如文件系统、数据库等。 .NET爬虫,又称...

Global site tag (gtag.js) - Google Analytics