`
flashdream8
  • 浏览: 680718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简介Lucene2.0中Query

PHP 
阅读更多

基本流程
1、 初始化IndexSearcher :Searcher searcher = new IndexSearcher(indexDir);//indexDir为索引存放路径
2、 生成Query对象: QueryParser类的parse()方法返回Query类形对象
3、 使用search(Query)方法,开始搜索,并返回Hits对象
4、 使用Hits对象的方法检索结果:

length();//结果总数量
doc(int n);//返回第n个文档;Document对象
id(int n);//第n个文档的内部ID
score(n);//第n个文档的分值,用于排序

例子:
IndexSearcher searcher = new IndexSearcher(“c:\\index”);
Query query = QueryParser.parse(“key1”,”name”,new StandardAnalyzer());
Hits hits = searcher.search(query);
If(hits.length()==0){
 Out.println(“not found”);
}
else{
 for(int i=0;i  Document d  = hits.doc(i);
 Out.println(d.get(“title”));
}
}

文档搜索结果的主要排序依据是文档的分值。改变文档分值的方法是建立索引时,在初始化Document对象后,使用Document的setBoost方法来改变文档的boost因子(分值的倍数):
Document doc = new Document();
Doc.add(Field.Text(“contents”,”text1 text2”));
Doc.setBoost(1.5f); //改变因子,如0.3f,1.0f等

构建Query:
Query是search包中的一个抽象类,它有许多子类,代表不同类形的查询

关键字TermQuery
Term term = new Term(“contents”,”java”);//实质也是一个键/值对
//构造TermQuery
Query query = new TermQuery(term);

组合查询BooleanQuery
BooleanQuery是一个查询容器,提供专门的方法往其中加入查询,并标明条件的关系
IndexSearcher searcher = new IndexSearcher(“c:\\index”);
Query q1 = new TermQuery(new Term(“name”,”tim”));
Query q2 = new TermQuery(new Term(“name”,”fly”));
//构造容器
Query query = new BooleanQuery();
query.add(q1,true,false);
query..add(q2,true,false);
Hits hits = searcher.search(query);

BooleanQuery的add方法的第二,第三参数说明:第二参数表示是否必须满足,第三参数表示是否不需要满足,组合一起有以下三种情况:
True,false:当前查询条件是必须要满足的
False ,true:当前查询是不可以满足的
False,false:条件是可选的
True,true:这种情况是错误的
以上表明,上述例子的两个条件都是必须满足的,是“与(and)”的关系
如果查进行“或(or)”运算,相应地可改为:
query.add(q1,false,false);
query.add(q2,false,false)

范围搜索RangeQuery
RangeQuery query = new RangeQuery(begin,end,included);//最后参数为是否包含边界
例:
Term begin = new Term(“time”,”20050101”);
Term end = new Term(“time”,”20050202”);
RangeQuery query = new RangeQuery(begin,end,false);

前缀PrefixQuery
PrefixQuery query = new PrefixQuery(new Term(“name”,”ti”));//name字段中以ti开头

多关键字PhraseQuery
PhraseQuery query = new PhraseQuery();
Query.add(new Term(“content”,”hello”));
Query.add(new Term(“content”,”world”));
Query.setSlop(2);
 //设置以上加上的两个关键字坡度,此值代表两个关键字之间无关词的个数.对于两个紧连的关键字,无论将坡度设为多少都能找到,如果两个词不紧连,且坡度值小于它们之间的无关词的数量,则无法找到

短词缀PhrasePrefixQuery
Term word1 = new Term(“content”,”david”);
Term word2 = new Term(“content”,”mary”);
Term word3 = new Term(“content”,”robert”);
PhrasePrefixQuery query = new PhrasePrefixQuery();
//加入不确定的词
Query.add(new Term[]{word1,word2});//不确定,第一个关键词在Term数组中产生
//加入确定的词
query.add(word3);
query.setSlop(2);//设置坡度
//以上查询中,david robert和mary robert都会出现在查询结果,同样地,mary and robert也会被击中

相近词FuzzyQuery
FuzzyQuery query = new FuzzyQuery(new Term(“content”,”david”));

通配符WildcardQuery
WildcardQuery query = new WildcardQuery(new Term(“content”,”*im”));
WildcardQuery query = new WildcardQuery(new Term(“content”,”t?m??”));
//*代表0个或多个字符,?一个字符

QueryParser类,把用户各种输入转为Query
Query query = QueryParser.parse(keywords,filedName,new StandardAnalyer());
关键字格式:
“tim” //在默认字段搜索tim
“name:tim”;//在name字段搜tim
“tim wong”或tim or wong;//在默认字段搜搜关键字tim 或wong
“+tim +wong”或”tim and wong” //搜索tim和 wong
”tim*”//在默认字段中搜前缀为tim的
“name:tim is a programer”;//在name字段中包含短语tim is a programer
“(tim or wong) and php” //在默认字段中搜含有tim 或wong的关键字,但一定要包含php
“name:tim –title:php” //name字段搜tim,并且title不含有php

另外,QueryParser构造时需要一个分析器,它应该与建立索引时的分析器一样

QueryParser的“与”和“或”
当输入两个关键字时,默认关系是或,要改变这种关系,方法是:
QueryParser parser = new QueryParser(keyword,fieldNmae,new StandardAnalyzer());
Parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);

 

排序及多字段查找

默认情况下,IndexSearcher类的search方法返回查询结果时,是按文档的分值排序的,可以使用重载的search方法对结果排序

IndexSearcher.search(Query,Sort);

new Sort() 和 Sort.RELEVANCE,以及null一样,采用默认排序,要定义排序字段,方法是将字段传入Sort对象

Sort sort = new Sort(String field);

也可以对多个字段排序Sort sort = new Sort(String[] fields);

例:

Sort sort = new Sort(new SortField[]{new SortField(“title”),new SortField(“name”)});

Hits hits=searcher.search(query,Sort);

 

多字段查找MultiFieldQueryParser

只在某些Term中查找,不关心在哪个字段

Query query = new MultiFieldQueryParser.parse(“word”,new String[]{“title”,”content”},analyzer); //在title和content中找word

多字段时默认是OR关系,要改变它,使用以下方法:

Query query = MultiFieldQueryParser.parse(“word”,new String[]{“title”,”content”},new int[]{MultiFieldQueryParser.REQUIRED_FIELD,MultiFieldQueryParser.PROHIBITED_FIELD},analyzer);

其中:

REQUIRED_FIELD 表示该条件必须有

PROHIBITED_FIELD 表示必须不含

 

索多个索引文件MultiSearcher

1)      建立多个索引:使用不同的索引目录,实例化不同的IndexWriter

2)      建立多索引搜索器:

Searcher[] searchers = new SEARCHER[2];

Searchers[0] = new IndexSearcher(dir1); //搜索索引目录一

Searchers[1]= new IndexSearcher(dir2);//搜索索引目录二

Searcher searcher = new MultiSearcher(serarchers);

3) 开始查询:Hits hits = searcher.search(query);

分享到:
评论

相关推荐

    lucene2.0+Heritrix配套源码

    《lucene2.0+Heritrix配套源码》是一个针对搜索引擎开发的资源包,包含了构建自定义搜索引擎所需的关键组件。Lucene是一个流行的全文搜索引擎库,而Heritrix则是一个强大的网页抓取工具,用于收集互联网上的数据。这...

    Lucene.2.0.API

    在Lucene 2.0中,主要的知识点包括以下几个核心模块: 1. **索引模块**:这是Lucene的基础,用于构建和管理全文索引。主要包括`IndexWriter`类,用于创建、更新和删除索引;`Analyzer`类,用于文本分析,将输入的...

    《开发自己的搜索引擎-Lucene 2.0 Heritrix》cd(全)(下载地址)

    ### 一、Lucene 2.0简介 Lucene是一款高性能、全功能的文本搜索引擎库,由Java语言编写。它为开发者提供了建立全文搜索应用程序的所有基本工具,包括索引文档、执行查询、获取结果等功能。Lucene 2.0是该系列中的一...

    重要lucene2.0 学习文档

    在 Lucene 2.0 版本中,相比于之前的 1.4.3 版本,有很多改进和优化,但同时也存在向后兼容性问题。2006 年 6 月 1 日发布的 Lucene 2.0,其下载地址是 http://apache.justdn.org/lucene/java/。 下面通过两个示例...

    Lucene2.0实例

    但作为入门实例,这个"Lucene2.0实例"应该会从最基本的层面教你如何启动并运行一个简单的搜索应用。通过学习并实践这些基础操作,你可以逐步掌握Lucene的核心功能,为进一步深入学习和开发更复杂的搜索系统奠定基础...

    Lucene.Net2.0(C#)

    在Lucene.Net 2.0中,这些功能被封装在易于使用的API中,使得开发人员能够快速集成全文搜索到他们的应用中。 二、索引构建 在Lucene.Net中,索引是通过Analyzer、Document和Field三个关键组件构建的。Analyzer负责...

    Lucene.Net 2.0 源码+文档

    5. **查询解析(Query Parsing)**:Lucene.Net支持多种查询语法,如布尔查询、短语查询、模糊查询等,同时提供查询解析器来处理用户输入的查询字符串,转化为可执行的查询对象。 6. **搜索执行(Searching)**:...

    Lucene.net 2.0源码

    首先,Lucene.NET 2.0 的核心概念包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。文档是存储信息的基本单位,可以包含多个字段,每个字段都有其特定的类型,如文本、日期或数字。索引过程将...

    Lucene.Net-2.0.doc.zip

    Lucene.Net 2.0 版本提供了强大的搜索功能,使得开发者能够轻松地在大量数据中进行高效的文本检索。这个类MSDN操作文档包含了对 Lucene.Net 2.0 的详细说明,帮助开发者理解和使用其丰富的特性和功能。 ### Lucene...

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...

    Lucene简单实例记录

    在Lucene 2.0及更高版本中,废弃了一些旧版本中的方法,如Field类的构造函数和一些静态方法。这要求开发者在使用时必须注意版本兼容性问题,确保使用的API与所安装的Lucene版本匹配。 ### Lucene的入门实例 #### ...

    Lucene.Net.dll

    在描述中提到的是Lucene 2.0版本的DLL文件,这是一个动态链接库,用于.NET开发者直接在他们的应用程序中集成Lucene的功能。DLL文件包含预编译的类和函数,使得开发人员可以快速地引入搜索功能,而无需深入了解底层的...

    Lucene 2 教程

    在 Lucene 2.0 版本中,相较于之前的 1.4.3 版本,存在不兼容性。如果你打算使用 Lucene 2.0,需要确保你的代码和配置适应这个新版本。Lucene 2.0 的下载地址可以通过 Apache 的镜像站点获取。 以下是一个简单的 ...

    lucene3.0全文检索入门实例

    本文将重点介绍如何使用 Lucene 3.0 实现全文检索的基本步骤,以及与前一版本 Lucene 2.0 的主要区别。 **1. 安装与环境配置** 首先,你需要下载 Lucene 3.0 的发行版,并将其添加到你的项目类路径中。确保你的开发...

    lucene排序、设置权重、优化、分布式搜索.pdf

    query.SetBoost(2.0f); ``` 在上面的代码中,我们使用 SetBoost 方法来将 "name" 字段的权重设置为 2.0。 三、Lucene 优化 Lucene 的优化是指对搜索引擎的性能进行优化。 Lucene 提供了多种优化方式,包括索引...

    Lucene.Net实现全文搜索

    - **商业化**:2.0 版本的发布标志着 Lucene.Net 正式进入商业领域。该版本提供了 DLL 方式的免费版本,但源代码版本需购买商业许可。 - **社区反应**:社区对于 Lucene.Net 商业化持不同意见,导致了 dotLucene 等...

    Lucene+Heritrix 源码

    在Lucene 2.0版本中,它引入了更高效的倒排索引结构,支持多字段搜索,并且优化了内存使用和搜索性能。通过阅读Lucene的源码,我们可以学习到以下关键知识点: 1. **倒排索引**:这是Lucene的核心数据结构,用于...

    Lucene.Net 2.9.2源码包(有Demo)

    Lucene.Net 2.9.2 版本是这个项目的其中一个稳定版本,提供了对 .NET Framework 的全面支持,包括对.NET 2.0 及以上版本的兼容。 **一、Lucene.Net 概述** 1. **核心概念**:Lucene.Net 基于倒排索引(Inverted ...

    Lucene.Net_2_9_1 含高亮等包完整版

    首先,Lucene.Net是开源软件,遵循Apache Software License 2.0协议,允许开发人员在商业和非商业项目中自由使用、修改和分发。它的核心功能包括索引、搜索、排序和过滤,为构建复杂的全文检索系统提供了基础。 ...

Global site tag (gtag.js) - Google Analytics