`
wordall1101
  • 浏览: 8808 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Lucene搜索引擎API的主要类介绍

阅读更多

Lucene搜索的api的类主要有4个 IndexSearcher ,Query(包括子类),QueryParser,Hits
一:IndexSearcher是搜索的入口,他的search方法提供了搜索功能
Query有很多子类, 各种不同的子类代表了不同的查询条件,下文详述
QueryParser是一个非常通用的帮助类,他的作用是把用户输入的文本转换为内置的Query对象(大多数web搜索引擎都提供一个查询输入框来让用户输入查询条件)。QueryParser内置提供了很多语法来使使用可以输入各种高级条件的Query。比如: "Hello AND world"会被解析为一个AND关系的BooleanQuery,他包含两个TermQuery(Hell和world)。这些语法虽然强大,但都针对英文设计,对我们需要中文搜索来说都不需要了解太多的Query类型,一般几个简单的就够用了。QueryParser的使用如下
QueryParser.parse(String query, String field, Analyzer analyzer) throws ParseException
其中:query是用户输入的内容,field是搜索默认的field(其他field需要显式指定),analyzer是用来将用户输入的内容也作分析处理(分词),一般情况下这里的anaylyzer是index的时候采用的同一analyzer。
另外我们也可以自己构造一个QueryParser: new QueryParser(String field, Analyzer a)(含义同上),这样做的好处是可以自己定义调整一些参数.
搜索结果的处理:Hits对象
Hits对象是搜索结果的集合 主要有下面几个方法
length() ,这个方法记录有多少条结果返回(lazy loading)
doc(n) 返回第n个记录
id(in) 返回第n个记录的Document ID
score(n) 第n个记录的相关度(积分)
由于搜索的结果一般比较大,从性能上考虑,Hits对象并不会真正把所有的结果全部取回,默认情况下是保留前100个记录(对于一般的搜索引擎,100个记录足够了).
分页的处理
100条记录还是太多,我们多半会每页显示20条记录,然后分为若干页显示,对于分页,一般有两个办法
在session中保留indexreader对象和hit对象,翻页的时候提取内容
不使用session,每次都简单处理为重新查询
lucene推荐先使用第二个办法,即每次都重新查询,这样做的好处是简单方便,不需要考虑session的问题,lucene的查询效率也能保证每次查询时间不长,除非真正有了性能问题,否则不用考虑第一个办法。
缓存:RAMDirectory的用法
RAMDirectory对象很好用,通过它,我们可以把一个普通的index完全读取到内存中,用法如下:
RAMDirectory ramDir = new RAMDirectory(dir);
这样的ramdir效率自然比真正的文件系统快很多
Lucene的scoring算法
lucence查询的纪录默认按照相关度排序,这个相关度就是score,scoring的算法是比较复杂的,对于我们做应用的人似乎没有什么帮助,(先说一下Term: 我的理解是Term为一个独立的查询词,用户输入的的查询通过各种分词,大小写处理(正规化),消除stopwords等)以后,会已Term为基本单位),几个关键参数稍微留意一下即可。
Term在文章中出现的频率量
包含同一个Term的文章的频率
field中的boosting参数
term的长度
term在文章中的数量
一般来说,这些参数我们都不可能去调整, 如果你想了解更多,IndexSearcher还提供了一个explain方法, 通过传入一个Query和document ID,你可以得到一个Explaination对象,他是对内部算法信息的简单封装,toString()一下就可以看到详细的说明
二:创建Query:各种query介绍
最普通的TermQuery
TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以构造
TermQuery把查询条件视为一个key, 要求和查询内容完全匹配,比如Field.Keyword类型就可以使用TermQuery
RangeQuery
RangeQuery表示一个范围的搜索条件,RangeQuery query = new RangeQuery(begin, end, included);
最后一个boolean值表示是否包含边界条件本身, 用字符表示为"[begin TO end]" 或者"{begin TO end}"
PrefixQuery
顾名思义,就是表示以某某开头的查询, 字符表示为"something*"
BooleanQuery
这个是一个组合的Query,你可以把各种Query添加进去并标明他们的逻辑关系,添加条件用
public void add(Query query, boolean required, boolean prohibited)
方法, 后两个boolean变量是标示AND or NOT三种关系 字符表示为" AND or NOT" 或 "+ -" ,一个BooleanQuery中可以添加多个Query, 如果超过setMaxClauseCount(int)的值(默认1024个)的话,会抛出TooManyClauses错误.
PhraseQuery
表示不严格语句的查询,比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一个setSlop()参数,在查询中,lucene会尝试调整单词的距离和位置,这个参数表示可以接受调整次数限制,如果实际的内容可以在这么多步内调整为完全匹配,那么就被视为匹配.在默认情况下slop的值是0, 所以默认是不支持非严格匹配的, 通过设置slop参数(比如"red pig"匹配"red fat pig"就需要1个slop来把pig后移动1位),我们可以让lucene来模糊查询. 值得注意的是,PhraseQuery不保证前后单词的次序,在上面的例子中,"pig red"需要2个slop,也就是如果slop如果大于等于2,那么"pig red"也会被认为是匹配的.
WildcardQuery
使用?和*来表示一个或多个字母比如wil*可以匹配 wild ,wila ,wilxaaaa...,值得注意的是,在wildcard中,只要是匹配上的纪录,他们的相关度都是一样的,比如wilxaaaa和wild的对于wil*的相关度就是一样的.
FuzzyQuery
这个Query对中文没有什么用处,他能模糊匹配英文单词(前面的都是词组),比如fuzzy和wuzzy他们可以看成类似, 对于英文的各种时态变化和复数形式,这个FuzzyQuery还算有用,匹配结果的相关度是不一样的.字符表示为 "fuzzy~"
三:QueryParser使用
对于搜索引擎, 很多情况下用户只需要一个输入框就要输入所有的查询条件(比如google), 这时,QueryParser就派上用场了,他的作用就是把各种用户输入转为Query或者Query组, 他把上面提到的Query的字符表示(Query.toString)转化为实际的Query对象,比如"wuzzy~"就会转换为FuzzyQuery, 不过QueryParser用到了Analyzer,所以QueryParser parse过后的Query再toString未必和原来的一样.Query额外的语法有:
分组:Groupping
比如"(a AND b) or C",就是括号分组,很容易理解
FieldSelectiong
QueryParser的查询条件是对默认的Field进行的, 它在QueryParser解析的时候编码指定, 如果用户需要在查询条件中选用另外的Field, 可以使用如下语法: fieldname:fielda, 如果是多个分组,可以用fieldname:(fielda fieldb fieldc)表示.
*号问题
QueryParse默认不允许*号出现在开始部分,这样做的目的主要是为了防止用户误输入*来头导致严重的性能问题(会把所有记录读出)
boosting
通过hello^2.0 可以对hello这个term进行boosting,(我想不到什么用户会这样么bt)
QueryParser是一个准备好的,立即可以工作的帮助类,不过他还是提供了很多参数供程序员调整,首先,我们需要自己构造一个新的QueryParser,然后对他的各种参数来定制化

分享到:
评论

相关推荐

    lucene+api搜索引擎引工具源码

    通过研究这个 C#.NET 版本的 Lucene 搜索引擎源码,开发者可以学习如何在 .NET 应用中集成全文搜索功能,了解 Lucene API 的用法,以及如何根据具体需求定制搜索引擎。这不仅对提升搜索体验有帮助,也有助于深入理解...

    LUCENE搜索引擎基本工作原理

    **LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...

    基于Lucene的搜索引擎的研究与应用

    文章主要研究和应用了基于Lucene的搜索引擎,其特点是利用开源网络爬虫工具抓取互联网信息,并通过Lucene的API对特定信息进行索引和搜索。下面详细介绍相关知识点。 1. Lucene基础 Lucene是由Apache软件基金会提供...

    lucene 2.0 api以及lucene 3.0 api

    Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当直观且高效,使得开发者能够快速地集成搜索功能。...

    Lucene搜索引擎 JSP + JAVA

    **Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...

    解密搜索引擎技术实战 LUCENE & JAVA(第3版)PDF

    这本书主要聚焦于LUCENE和JAVA这两种技术在搜索引擎开发中的应用,为读者揭示了搜索引擎背后的复杂机制和实现细节。 LUCENE是一个开源的全文检索库,由Apache软件基金会维护。它是Java编写,提供了高效的文本搜索...

    Lucene搜索引擎开发权威经典

    《Lucene搜索引擎开发权威经典》是一本由作者于天恩撰写的关于Lucene搜索引擎开发的书籍。这本书以幽默轻松的写作风格,深入浅出地介绍了Lucene的基础知识和实践应用,虽然在深度上可能稍显不足,但其详尽的代码注释...

    Lucene搜索引擎1

    在"Lucene搜索引擎1"这个主题中,我们将深入探讨Lucene的基本概念、核心组件以及如何使用它来构建一个简单的搜索引擎。 首先,Lucene的核心功能是索引和搜索。它能够将非结构化的文本数据(如网页、文档等)转化...

    Solr Elasticsearch lucene 搜索引擎

    Solr、Elasticsearch和Lucene是三个在搜索引擎领域中至关重要的技术,它们共同构建了现代数据检索的基础架构。下面将分别对这三个组件进行详细解释,并探讨它们之间的关系。 **Lucene** Lucene是一个高性能、全文本...

    基于Lucene的中型搜索引擎(C#)

    **基于Lucene的中型搜索引擎(C#)** 在IT领域,搜索引擎是不可或缺的一部分,它们能够高效地处理海量数据,帮助用户快速找到所需信息。本文将深入探讨一个基于Apache Lucene的中型搜索引擎实现,该实现是由...

    Lucene3.0.1 官方api

    API文档详细地阐述了各种类、方法和接口,帮助开发者构建自己的搜索引擎应用。以下是一些关键的知识点: 1. **索引过程**:Lucene通过`IndexWriter`类来创建和更新索引。开发者可以使用这个类来添加、删除或更新...

    Lucene搜索-引擎开发权威经典pdf+源码第二部分

    《Lucene搜索-引擎开发权威经典》是一本深入解析Apache Lucene搜索引擎库的专业书籍,它为读者提供了构建高效全文搜索引擎的全面指南。Lucene是Java领域最著名的全文检索库,被广泛应用于各种信息检索系统中,包括...

    lucene4.10.3的api的chm合集

    Apache Lucene是一个高性能、全文本搜索库,被广泛应用于各种搜索引擎的开发。这里的"lucene4.10.3的api的chm合集"是针对该版本的一个API文档集合,包含了多个模块的CHM(Microsoft HTML Help)格式的参考指南。尽管...

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

    《基于LUCENE的搜索引擎设计与实现》 在信息技术飞速发展的今天,搜索引擎已经成为人们获取信息的重要工具。本文将深入探讨如何使用Apache LUCENE这一强大的全文搜索引擎库,设计并实现一个高效的搜索引擎。LUCENE...

    lucene_heritrix 搜索引擎

    Lucene和Heritrix是两个在信息技术领域中用于搜索引擎构建的重要工具。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了一个简单的API来索引和搜索大量文本数据。Heritrix,另一方面,是一个...

Global site tag (gtag.js) - Google Analytics