`
kernaling.wong
  • 浏览: 78821 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

实现类用Lucene PrefixQuery 来实现 Google Suggest 的功能的一种简单方法

    博客分类:
  • java
阅读更多
开场白:
  在我们上google或者baidu的时候,在输入框中输入关键字,然后就有建议的提示来让用户选择。如下图:



可以看到,输入了前面的关键字就能全部匹配了关键出来了。但有人会问,直接用BooleanQuery与TermQuery组合起来即可以实现这样的结果了。可是这里有点不同的是首先用户输入的每一个字母并不一定是分词器可以分出来的,同时,大家可以发现返回的结果都是一定先以用户输入的为前匹配的,所以如果单纯用普通的分词是不能实现这样的效果的。

如何做:
  但如果我们理解了Term在Lucene中的应用后,就很容易实现这个效果了。用公司名称来举例子,现在我们需要用户输入公司名称中的某部分,用户每输入一个字,则需要每次返回全包含这些关键字的结果,比如:

   用户输入了“电力工程”,用户会匹配出
  
    广州市电力工程制造有限公司
    广州市天河区电力工程有限公司
    广州市白云区电力工程生产有限公司
          。。。。。

   而不能搜索出这样的结果,因为它不是全匹配
    广东省电力电子设备公司
    江门市电力用品设备公司

为了实现这样的效果,我们在建立索引的时候需要注意了。

平时我们建立索引都是通过

Doceume doc = new Document();
doc.add(new Field("CompanyName","广州市电气设备制造有限公司",Index.ANALYZED,Store.NO));

来建立的,而这样把 add了Field索引后,其实是已经通过了建立IndexWriter时的传入的那个分词器作了分词了。

所以我们手动的不使用IndexWriter的分词了。
对一个公司名的字段作了以下的方式建立索引。

String companyName = "广州市电气设备制造有限公司";
int len = companyName.length();
for(int i=0;i<len;i++){
  String value = companyName.subString(i,len);
  indexWriter.add(new Field("CompanyName",value ,Index.NOT_ANALYZED,Store.NO));
|


其实这样使用公司名称在索引中建立了以下的 Term 保存到索引里面

广州市电气设备制造有限公司
  州市电气设备制造有限公司
    市电气设备制造有限公司
      电气设备制造有限公司
        气设备制造有限公司
          设备制造有限公司
            备制造有限公司
              制造有限公司
              。。。。。。
                        司

注意思了,这里都没有作任何的分词的,或者大家可以通过调用 toString()方法 查看 这个Document 里面的Term情况就明白了。

OK,基本完成了。在搜索的时候,我们只需要
按用户输入的关键字

    
     String keyWord = "电气";
     PrefixQuery pg = new PrefixQuery(new Term("CompanyName",keyWord ));
     


  这样Lucene就会以[Query:companyName 电气*] 这样的前匹配搜索了,大家可以看到,无论用户输入的字是否能分词也匹配上了上面那个公司名称了。同时也是全匹配的。


结束语:
   这里有人会提出使用FuzzyQuery或者wildcardQuery等。类正则表达式的搜索方法,当然这个如果是非中文当然可以的,如果是中文的话,还是不支持的。

    欢迎大家指出本文章的错误之处。欢迎在博客上留言。欢迎转载,请注明出处:
http://kernaling-wong.iteye.com/blog/694711
  • 大小: 5.5 KB
  • 大小: 4.2 KB
分享到:
评论

相关推荐

    google suggest 的实现

    Lucene 是一个开源的全文检索引擎工具包,它提供了高度可定制化的搜索功能,是实现 Google Suggest 后端逻辑的关键组件之一。 1. **索引建立**: - 首先需要根据文档内容建立索引。 - 可以选择使用数据库(如 ...

    lucene-suggest-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-7.7.0.jar; 赠送原API文档:lucene-suggest-7.7.0-javadoc.jar; 赠送源代码:lucene-suggest-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-7.7.0.pom; 包含翻译后的API...

    Lucene5学习之Suggest关键字提示

    这一功能广泛应用于搜索框中,能够帮助用户更快找到他们想要的信息,同时也提高了搜索的精确性。 在Lucene5中,Suggester是实现关键词提示的核心类,它负责构建索引并提供查询建议。Suggester的构建基于两部分数据...

    lucene-suggest-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-6.6.0.jar; 赠送原API文档:lucene-suggest-6.6.0-javadoc.jar; 赠送源代码:lucene-suggest-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-6.6.0.pom; 包含翻译后的API...

    一种基于Lucene检索引擎的全文数据库的研究与实现

    本文介绍了一种基于Lucene检索引擎的全文数据库的实现方法,该方法不需要依赖于传统的后台数据库系统。这种方法的核心在于: - **索引构建**:使用Lucene构建全文索引,以便快速检索文档中的内容。 - **数据存储**...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    Apache Lucene 是一个开源的全文检索库,它提供了一种高效、可扩展的方式来构建全文搜索引擎。在Java开发中,Lucene被广泛用于实现文件的全文检索功能,包括对doc、docx、pdf、txt等常见格式文档的文本内容检索。在...

    使用compass+lucene实现简单的全文检索功能

    本文将详细介绍如何使用 Compass 和 Lucene 实现一个简单的全文检索功能。 首先,Lucene 是一个高性能、全功能的文本分析库,主要用于信息检索。它提供了索引和搜索大量文本数据的能力,包括分词、分析、存储和搜索...

    Lucene 搜索方法(模糊搜索)

    在Lucene中,我们可以通过`FuzzyQuery`类来实现这种功能。`FuzzyQuery`基于Levenshtein距离算法,该算法计算两个字符串之间的差异程度,用于衡量它们的相似性。 首先,我们需要了解如何创建一个`FuzzyQuery`。在`...

    Lucene实现全文检索

    这篇博文将深入探讨如何使用Lucene来实现全文检索。 **一、Lucene的基本概念** 1. **索引(Indexing)**:Lucene的核心工作流程之一是创建索引。索引是一个结构化的数据存储,类似于图书馆的目录,能够快速定位到...

    paoding+lucene实现全文检索功能简单实例

    本实例将介绍如何结合Paoding和Lucene来实现一个简单的全文检索系统,这在处理中文数据时尤其有效。 首先,让我们了解一下Paoding。Paoding是一款优秀的中文分词库,它针对中文的特点进行了优化,能有效地进行词语...

    lucene-suggest-6.6.0

    lucene-suggest-6.6.0完整包,包含demo和技术文档,core文件夹中是核心包,有些功能需要引用各文件夹中的其他jar包

    Lucene与SSH2搜索功能

    通过这种方式,开发者可以利用SSH2的强大功能构建一个完整的Web应用,并借助Lucene实现高效的全文搜索。这种集成方式不仅可以提高应用的用户体验,还能在大型数据集上实现快速、精确的搜索。在实际开发中,还需要...

    lucene自定义排序实现

    然后,你可以使用`IndexSearcher`的`searchAfter()`方法或`TopFieldCollector`来实现排序。注意,FieldCache可能会消耗大量内存,因此需要谨慎使用。 2. **CustomScoreQuery排序**:如果你的排序逻辑与查询评分相关...

    Lucene 搜索方法(前缀搜索)

    总结来说,Lucene的前缀搜索功能通过`PrefixQuery`类实现,结合适当的查询解析器和分析器,为用户提供了一种快速、灵活的方式,来查找与输入前缀相关的所有文档。这在诸如在线商店、知识库、搜索引擎等应用中具有很...

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

    Lucene是一个高性能、全文本搜索库,它被广泛应用于各种系统中以提供高效、精确的搜索功能。本篇文章将详细探讨如何在C#环境下利用Lucene实现快速搜索。 首先,让我们了解Lucene的基本概念。Lucene是一个开源的Java...

    lucene-suggest-7.2.1-API文档-中文版.zip

    赠送jar包:lucene-suggest-7.2.1.jar; 赠送原API文档:lucene-suggest-7.2.1-javadoc.jar; 赠送源代码:lucene-suggest-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-7.2.1.pom; 包含翻译后的API...

    java Lucene 工具类

    这个“Java Lucene 工具类”可能是一个博主分享的关于如何使用Lucene进行文本处理、索引创建和查询执行的实例代码集合。 Lucene的主要功能包括: 1. 文档分析:Lucene包含一个强大的分析模块,可以将输入的文本分解...

    lucene-suggest-7.3.1-API文档-中文版.zip

    赠送jar包:lucene-suggest-7.3.1.jar; 赠送原API文档:lucene-suggest-7.3.1-javadoc.jar; 赠送源代码:lucene-suggest-7.3.1-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-7.3.1.pom; 包含翻译后的API...

Global site tag (gtag.js) - Google Analytics