- [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
11.4.4 使用前缀搜索—PrefixQuery
PrefixQuery就是使用前缀来进行查找的。通常情况下,首先定义一个词条Term。该词条包含要查找的字段名以及关键字的前缀,然后通过该词条构造一个PrefixQuery对象,就可以进行前缀查找了。
下面以代码11.7为例来介绍使用PrefixQuery进行检索的运行过程。
代码11.7 PrefixQueryTest.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.PrefixQuery;
import org.apache.lucene.search.RangeQuery;
public class PrefixQueryTest {
public static void main(String[] args) throws Exception {
//生成Document对象,下同
Document doc1 = new Document();
//添加“name”字段的内容,下同
doc1.add(Field.Text("name", "David"));
//添加“title”字段的内容,下同
doc1.add(Field.Keyword("title", "doc1"));
Document doc2 = new Document();
doc2.add(Field.Text("name", "Darwen"));
doc2.add(Field.Keyword("title", "doc2"));
Document doc3 = new Document();
doc3.add(Field.Text("name", "Smith"));
doc3.add(Field.Keyword("title", "doc3"));
Document doc4 = new Document();
doc4.add(Field.Text("name", "Smart"));
doc4.add(Field.Keyword("title", "doc4"));
//生成索引书写器
IndexWriter writer = new IndexWriter("c:\\index",
new StandardAnalyzer(), true);
//设置为混合索引模式
writer.setUseCompoundFile(true);
//依次将文档添加到索引中
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
//关闭索引书写器
writer.close();
//生成索引搜索器对象
IndexSearcher searcher = new IndexSearcher("c:\\index");
//构造词条
Term pre1 = new Term("name", "Da");
Term pre2 = new Term("name", "da");
Term pre3 = new Term("name", "sm");
//用于保存检索结果
Hits hits = null;
//生成PrefixQuery类型的对象,初始化为null
PrefixQuery query = null;
query = new PrefixQuery(pre1);
//开始第一次检索,并返回检索结果
hits = searcher.search(query);
//输出相应的检索结果
printResult(hits, "前缀为'Da'的文档");
query = new PrefixQuery(pre2);
//开始第二次检索,并返回检索结果
hits = searcher.search(query);
//输出相应的检索结果
printResult(hits, "前缀为'da'的文档");
query = new PrefixQuery(pre3);
//开始第二次检索,并返回检索结果
hits = searcher.search(query);
//输出相应的检索结果
printResult(hits, "前缀为'sm'的文档");
}
public static void printResult(Hits hits, String key) throws Exception
{System.out.println("查找 \"" + key + "\" :");
if (hits != null) {
if (hits.length() == 0) {
System.out.println("没有找到任何结果");
System.out.println();
} else {
System.out.print("找到");
for (int i = 0; i < hits.length(); i++) {
//取得文档
Document d = hits.doc(i);
//取得“title”字段的内容
String dname = d.get("title");
System.out.print(dname + " ");
}
System.out.println();
System.out.println();
}
}
}
}
在上述代码中,首先构造了4个不同的Document。每个Document都有一个名为“name”的字段,其中存储了人物的名称。然后,代码构建了3个不同的词条,分别为“Da”、“da”和“sm”,可以看到,它们正好都是“name”字段中关键字的前缀。
代码的运行结果如图11-12所示。
从图11-12中可以看出,使用PrefixQuery共进行了3次检索,关键字分别为“Da”、“da”和“sm”,返回的检索结果情况在图中已经有明确的说明。不过,如果使用“Da”作为关键字会没有任何的检索结果,而使用“da”就有检索结果,这个问题将在后面作详细介绍。
从代码11.7和图11-12中可以看出,“da”前缀和“sm”前缀都顺利地找到了它们所在的文档,可是为什么与文档中关键字大小写一致的“Da”却没有找到呢?这是因为Lucene的标准分析器在进行分词过滤时将所有的关键字一律转成了小写,所以才会出现这样的结果。这也是开发者应当引起注意的地方。
共7页: 上一页 [1] [2] [3] 4 [5] [6] [7] 下一页
最新评论:
