- [Lucene]Nutch/Lucene的存取机制与结构分析
- [Lucene]lucene实例
- [Lucene]Hibernate Search牛刀小试
- [Lucene]lucene2_0创建、检索和删除功能的完
- [Lucene]Lucene+hibernate+spring配置心得
- [Lucene]lucene 学习
- [Lucene]Lucene 安装
- [Lucene]LUCENE中文使用先锋和前辈
- [Lucene]Nabble
- [Lucene]LUCENE IN ACTION中文版-第七章(1)
- [Lucene]A quick (less certain) note on usi
- [Lucene]Lucene In-Memory Text Search Examp
- [Lucene]lucene-Class MemoryIndex
- [Lucene]基于LUCENE的英汉双语信息检索研究
- [Lucene] Lucene In Action中文版-第四章(II)
- [Lucene]lucene使用与优化
- [Lucene]Lucene 索引机制
- [Lucene]lucene Class ChineseAnalyzer
- [Lucene]LUCENE module
- [Lucene]lucene结构中文说明(一)
- [Lucene]New Search Tool on iXtenso
- [Lucene]Nutch/Lucene的存取机制与结构分析
- [Lucene]lucene实例
- [Lucene]lucene.net的一些基本使用方法和概念
- [Lucene]Lucene搜索引擎API的主要类介绍
- [Lucene]Hibernate Search牛刀小试
- [Lucene]广州太博互动诚聘精英
- [Lucene]LUCEN:如何索引PDF格式文件
- [Lucene] Full-time opportunity in Paris, F
- [Lucene]Lucene索引查询分页实例
- [Lucene]lucene使用与优化
- [Lucene]Lucene 索引机制
- [Lucene]lucene Class ChineseAnalyzer
- [Lucene]LUCENE module
- [Lucene]lucene结构中文说明(一)
- [Lucene]New Search Tool on iXtenso
- [Lucene]Nutch/Lucene的存取机制与结构分析
- [Lucene]lucene实例
- [Lucene]lucene.net的一些基本使用方法和概念
- [Lucene]Lucene搜索引擎API的主要类介绍
- [Lucene]Hibernate Search牛刀小试
- [Lucene]广州太博互动诚聘精英
- [Lucene]LUCEN:如何索引PDF格式文件
- [Lucene] Full-time opportunity in Paris, F
- [Lucene]Lucene索引查询分页实例
- Google广告位置
- Google AD
搜索流程中的第二步就是构建一个Query。下面就来介绍Query及其构建。
当用户输入一个关键字,搜索引擎接收到后,并不是立刻就将它放入后台开始进行关键字的检索,而应当首先对这个关键字进行一定的分析和处理,使之成为一种后台可以理解的形式,只有这样,才能提高检索的效率,同时检索出更加有效的结果。那么,在Lucene中,这种处理,其实就是构建一个Query对象。
就Query对象本身言,它只是Lucene的search包中的一个抽象类,这个抽象类有许多子类,代表了不同类型的检索。如常见的TermQuery就是将一个简单的关键字进行封装后的对象,类似的还有BooleanQuery,即布尔型的查找。
IndexSearcher对象的search方法中总是需要一个Query对象(或是Query子类的对象),本节就来介绍各种Query类。
11.4.1 按词条搜索—TermQuery
TermQuery是最简单、也是最常用的Query。TermQuery可以理解成为“词条搜索”,在搜索引擎中最基本的搜索就是在索引中搜索某一词条,而TermQuery就是用来完成这项工作的。
在Lucene中词条是最基本的搜索单位,从本质上来讲一个词条其实就是一个名/值对。只不过这个“名”是字段名,而“值”则表示字段中所包含的某个关键字。
要使用TermQuery进行搜索首先需要构造一个Term对象,示例代码如下:
Term aTerm = new Term("contents", "java");
然后使用aTerm对象为参数来构造一个TermQuery对象,代码设置如下:
Query query = new TermQuery(aTerm);
这样所有在“contents”字段中包含有“java”的文档都会在使用TermQuery进行查询时作为符合查询条件的结果返回。
下面就通过代码11.4来介绍TermQuery的具体实现过程。
代码11.4 TermQueryTest.java
package ch11;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
public class TermQueryTest
{
public static void main(String[] args) throws Exception
{
//生成Document对象
Document doc1 = new Document();
//添加“name”字段的内容
doc1.add(Field.Text("name", "word1 word2 word3"));
//添加“title”字段的内容
doc1.add(Field.Keyword("title", "doc1"));
//生成索引书写器
IndexWriter writer = new IndexWriter("c:\\index", new StandardAnalyzer(), true);
//将文档添加到索引中
writer.addDocument(doc1);
//关闭索引
writer.close();
//生成查询对象query
Query query = null;
//生成hits结果对象,保存返回的检索结果
Hits hits = null;
//生成检索器
IndexSearcher searcher = new IndexSearcher("c:\\index");
// 构造一个TermQuery对象
query = new TermQuery(new Term("name","word1"));
//开始检索,并返回检索结果到hits中
hits = searcher.search(query);
//输出检索结果中的相关信息
printResult(hits, "word1");
// 再次构造一个TermQuery对象,只不过查询的字段变成了"title"
query = new TermQuery(new Term("title","doc1"));
//开始第二次检索,并返回检索结果到hits中
hits = searcher.search(query);
//输出检索结果中的相关信息
printResult(hits, "doc1");
}
public static void printResult(Hits hits, String key) throws Exception
{
System.out.println("查找 \"" + key + "\" :");
if (hits != null)
{
if (hits.length() == 0)
{
System.out.println("没有找到任何结果");
}
else
{
System.out.println("找到" + hits.length() + "个结果");
for (int i = 0; i < hits.length(); i++)
{
Document d = hits.doc(i);
String dname = d.get("title");
System.out.print(dname + " ");
}
System.out.println();
System.out.println();
}
}
}
}
在代码11.4中使用TermQuery进行检索的运行结果如图11-8所示。
注意:字段值是区分大小写的,因此在查询时必须注意大小写的匹配。
从图11-8中可以看出,代码11.4两次分别以“word1”和“doc1”为关键字进行检索,并且都只得到了一个检索结果。
在代码11.4中通过构建TermQuery的对象,两次完成了对关键字的查找。两次查找过程中不同的是,第一次构建的TermQuery是查找“name”这个字段,而第二次构建的TermQuery则查找的是“title”这个字段。
最新评论:
