- 浏览: 361508 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
guji528:
很好,清晰明了!
(8)python教程:几行代码搞定python 设计模式 -
poson:
为什么踩啊?
三言两语谈团队合作 -
andyhelberg:
你好,想请教一下关于应用敏捷开发在软件维护过程的经验。欢迎与我 ...
对scrum开发的感受 -
poson:
chenwq 写道可以提供behavior targeting ...
最近公司培训的算法 -
chenwq:
可以提供behavior targeting 相关材料不?先谢 ...
最近公司培训的算法
Lucene 的搜索
以上完成了索引的建立和一些关于索引的知识,但是光有索引是不行的,我们真正要做的检索,这才是我们的关键。现在我们看看 lucene 的检索吧。
认识检索从检索的工具开始吧! IndexSearcher 类是 lucene 用于检索的工具类,我们在检索之前要得到这个类的实例。
第一步我们看以下代码:
IndexSearcher searcher = new IndexSearcher("c:\\index");
创建 IndexSearcher 实例需要告诉 lucene 索引的位置,就是你 IndexWrite 的文件路径。
Query query = null;
Hits hits = null;
query = QueryParser.parse(key1, "name", new StandardAnalyzer());
hits = searcher.search(query);
if (hits != null) {
if (hits.length() == 0) {
System.out.println(" 没有找到任何结果 ");
} else {
System.out.print(" 找到 ");
for (int i = 0; i < hits.length(); i++) {
Document d = hits.doc(i);
String dname = d.get("title");
System.out.print(dname + " " );
}
}
}
}
以上就是一个完整的检索过程,这里我们看见了个 Query 和 Hits ,这两个类就是比较关键的了,我们先从检索结果的 Hits 类说起。
我们使用 Hits 经常使用的几个方法有:
length() :返回搜索结果的总数量。
Doc(int n) : 放回第 n 个文档。
Id(int n) : 返回第 n 个文档的内部编号。
Sorce(int n) : 返回第 n 个文档的得分。
看见这个 Sorce(int n) 这个方法,是不是就可以联想到搜索引擎的排序问题呢,像百度的推广是怎么做出来的呢 , 可想而知吧,那就说明必定存在一中方法可以动态的改变某片文档的得分。对了, lucene 中可以使用 Document 的 setBoost 方法可以改变当前文档的 boost 因子。
下面我们看看:
Document doc1 = new Document();
doc1.add(Field.Text("contents", "word1 word"));
doc1.add(Field.Keyword("path", "path\\document1.txt"));
doc1.setBoost(1.0f);
这样我们就在改变了篇文档的评分了,当 boost 的值越大它的分值就越高,其出现的位置就越靠前。
让我们再来看看 lucene 为我们提供的各种 Query 吧。
第一、 按词条搜索 - TermQuery
query = new TermQuery(new Term("name","word1"));
query = new TermQuery(new Term("name","word1"));
hits = searcher.search(query);
这样就可以把 field 为 name 的所有包含 word1 的文档检索出来了。
第二、“与或”搜索 - BooleanQuery
它实际是一个组合 query 看看下面的代码:
query1 = new TermQuery(new Term("name","word1"));
query2 = new TermQuery(new Term("name","word2"));
query = new BooleanQuery();
query.add(query1, false, false);
query.add(query2, false, false);
hits = searcher.search(query);
看看 booleanQuery 的用法吧:
true & true : 表明当前加入的字句是必须要满足的。相当于逻辑与。
false & true : 表明当前加入的字句是不可一被满足的, 相当于逻辑非。
false & false : 表明当前加入的字句是可选的,相当于逻辑或。
true & true : 错误的情况。
Lucene 可以最多支持连续 1024 的 query 的组合。
第三、在某一范围内搜索 - RangeQuery
IndexSearcher searcher = new IndexSearcher("c:\\index");
Term beginTime = new Term("time","200001");
Term endTime = new Term("time","200005");
Hits hits = null;
RangeQuery query = null;
query = new RangeQuery(beginTime, endTime, false);
hits = searcher.search(query);
RangeQuery 的构造函数的参数分别代表起始、结束、是否包括边界。这样我们就可以按照要求检索了。
第四、使用前缀检索 - PrefixQuery
这个检索的机制有点类似于 indexOf() 从前缀查找。这个常在英文中使用,中文中就很少使用了。代码如下:
IndexSearcher searcher = new IndexSearcher("c:\\index");
Term pre1 = new Term("name", "Da");
query = new PrefixQuery(pre1);
hits = searcher.search(query);
第五、多关键字的搜索 - PhraseQuery
可以多个关键字同时查询。使用如下:
query = new PhraseQuery();
query.add(word1);
query.add(word2);
query.setSlop(0);
hits = searcher.search(query);
printResult(hits, "'david' 与 'mary' 紧紧相隔的 Document");
query.setSlop(2);
hits = searcher.search(query);
printResult(hits, "'david' 与 'mary' 中相隔两个词的短语 ");
这里我们要注意 query.setSlop(); 这个方法的含义。
query.setSlop(0);紧紧相连 (这个的条件比较苛刻)
query.setSlop(2);相隔
第六、使用短语缀搜索 - PharsePrefixQuery
使用 PharsePrefixQuery 可以很容易的实现相关短语的检索功能。
实例:
query = new PhrasePrefixQuery();
// 加入可能的所有不确定的词
Term word1 = new Term("content", "david");
Term word2 = new Term("content", "mary");
Term word3 = new Term("content", "smith");
Term word4 = new Term("content", "robert");
query.add(new Term[]{word1, word2});
// 加入确定的词
query.add(word4);
query.setSlop(2);
hits = searcher.search(query);
printResult(hits, " 存在短语 'david robert' 或 'mary robert' 的文档 ");
第七、相近词语的搜索 - fuzzyQuery
可以通俗的说它是一种模糊查询。
实例:
Term word1 = new Term("content", "david");
Hits hits = null;
FuzzyQuery query = null;
query = new FuzzyQuery(word1);
hits = searcher.search(query);
printResult(hits," 与 'david' 相似的词 ");
第八、使用通配符搜索 - WildcardQuery
实例:
IndexSearcher searcher = new IndexSearcher("c:\\index");
Term word1 = new Term("content", "*ever");
Term word2 = new Term("content", "wh?ever");
Term word3 = new Term("content", "h??ever");
Term word4 = new Term("content", "ever*");
WildcardQuery query = null;
Hits hits = null;
query = new WildcardQuery(word1);
hits = searcher.search(query);
printResult(hits, "*ever");
query = new WildcardQuery(word2);
hits = searcher.search(query);
printResult(hits, "wh?ever");
query = new WildcardQuery(word3);
hits = searcher.search(query);
printResult(hits, "h??ever");
query = new WildcardQuery(word4);
hits = searcher.search(query);
printResult(hits, "ever*");
由上可以看出通配符?代便 1 个字符, * 代表 0 到多个字符。
Lucene 现在支持以上八中的搜索方式,我们可以根据需要选择适合自己的搜索方式。当然上面提供的一些可能对英文还是比较有效,中文就不可取了,所以我们开始想想百度,我们只在一个输入框中搜索结果。有了这个疑问我们揭开下一章的讨论吧!
查询字符串的解析:这个就是我们经常在一个输入框中输入我们要检索的文字,交给搜索引擎去帮我们分词。
QueryParser 类就是对查询字符串的解析类。
看看它的用法:
query = QueryParser.parse(key1, "name", new StandardAnalyzer());
hits = searcher.search(query);
它直接返回一个 Query 对象。需要传入的参数分别是:
用户需要查询的字符串、需要检索的对应字段名称、采用的分词类。
Analyzer analyzer = new CJKAnalyzer();
String[] fields = {"filename", "content"};
Query query = MultiFieldQueryParser.parse(searchword, fields, analyzer);
Hits hits = searcher.search(query);
QueryParser 的“与” 和 “或”:
QueryParser 之间默认是或,我们想改变为与的话加入以下代码:
QueryParser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);
就可以了。
5 高级搜索技巧
前面我们已经介绍了一般情况下 lucene 的使用技巧,现在我们探讨一下高级搜索的技巧吧!
1、 对搜索结果进行排序:
1) 使用 sort 类排序:
Sort sort = new Sort();
hits = searcher.search(query,sort);
这种方式是使用默认的 sort 排序方式进行排序。默认的 sort 排序是按照相关度进行排序。即通过 luence 的评分机制进行排序。
2) 对某一字段进行排序
Sort sort = new Sort( “ content ” );
hits = searcher.search(query,sort);
3) 对多个字段进行排序
Sort sort = new Sort(new SortField[]{new SortField("title"),new SortField("contents")});
hits = searcher.search(query,sort);
2、 多域搜索和多索引搜索:
在使用 luecene 时,如果查询的只是某些 terms ,而不关心这些词条到时来自那个字段中时。这时可以使用 MultiFieldQueryParser 类。这个用于用户搜索含有某个关键字是否存在在字段中,他们之间的关系使用 OR 连接。即不管存在在哪一个字段都会显示显示出来。
使用 MultiSearcher 可以满足同时多索引的搜索需求。
Searcher[] searchers = new Searcher[2];
searchers[0] = new IndexSearcher(indexStoreB);
searchers[1] = new IndexSearcher(indexStoreA);
// 创建一个多索引检索器
Searcher mSearcher = new MultiSearcher(searchers);
3、 对搜索结果进行过滤:
1) 对时间进行过滤
通常情况下我们对搜索结果要进行过滤显示,即只显示过滤后的结果。
doc.add(Field.Keyword("datefield", DateField.timeToString(now - 1000)));
DateFilter df1 = DateFilter.Before("datefield", now);
2) 查询过滤器
通过查询过滤器可以过滤一部分的信息。
Filter filter = new Filter()
{
public BitSet bits (IndexReader reader) throws IOException
{
BitSet bitset = new BitSet(5);
bitset.set (1);
bitset.set (3);
return bitset;
}
};
// 生成带有过滤器的查询对象
Query filteredquery = new FilteredQuery (query, filter);
// 返回检索结果
Hits hits = searcher.search (filteredquery);
这样我们就可以使用自己定义的过滤方式去过滤信息了。
3) 带缓存的过滤器:
使用待缓存的过滤器我们可以重用过滤功能,如下:
MockFilter filter = new MockFilter();
CachingWrapperFilter cacher = new CachingWrapperFilter(filter);
cacher.bits(reader);
以上介绍完了现在学习 luence ,没有太详细的介绍它的实现,因为它对于我们来说是一个工具,既然是工具我们就要会用就可以了。
发表评论
-
CSDN对推荐系统算法的漠视
2012-03-16 12:55 1390互联网海量用户和海量信息面前,信息不再是稀缺的事物,反 ... -
推荐系统
2012-03-15 19:42 0互联网海量用户和海量信息面前,信息不再是稀缺的事物,反 ... -
互联网应用--矩阵的奥秘
2012-03-15 14:55 0主成分分析 数据压缩 大矩阵乘法 矩阵分解 -
深入搜索引擎--排序
2012-03-13 08:32 0整个互联网有大量的数据,而且每天都在迅速的增加新的页面 ... -
深入搜索引擎--索引和cache
2012-03-13 08:24 0什么是倒排索引? 所谓倒排索引,即以关键词作为key,包 ... -
重新设计短信查询系统
2012-03-12 23:09 0服务抓取 人工标注工具 消息中心 Query分析 索引 ... -
深入搜索引擎--机器学习方法
2012-03-14 22:41 1738机器学习方法在搜索引 ... -
深入搜索引擎--查询(Query)
2012-03-12 22:56 24411.Query的数据分析 Que ... -
lucene.net 查询与添加索引的同步问题
2008-03-21 09:59 1519Lucene.Net 遵循以下规则:1. 允许任意多的读 ... -
Lucene基本知识
2008-04-22 14:56 881本文仅记录一些简单的使用方法,供初学者参考。以下例子采用 ... -
lucene的多关键词或查询
2008-04-25 15:05 2199//使用布尔查询 BooleanQuery bquery = ... -
垂直搜索数据源问题
2008-04-28 12:53 854垂直搜索与web搜索有很大的不同,一个非常大的区别在于对 ... -
百度 google的垂直搜索
2008-04-29 13:13 922我们发现在 ...
相关推荐
《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...
**Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...
**LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...
本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精炼简洁,恰到好处。 本书包含了必要的理论,但以实践为主。所讲的理论都不是纸上谈兵,都是可以立即付诸实践进行...
《Lucene搜索-引擎开发权威经典》是一本深入解析Apache Lucene搜索引擎库的专业书籍,它为读者提供了构建高效全文搜索引擎的全面指南。Lucene是Java领域最著名的全文检索库,被广泛应用于各种信息检索系统中,包括...
《Lucene搜索引擎开发权威经典》是一本深入探讨Apache Lucene的专著,作者于天恩在书中详尽地阐述了Lucene的核心概念、工作原理以及实际应用。这本书旨在帮助读者理解如何利用Lucene构建高性能、可扩展的全文搜索...
**基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...
《深入理解Lucene搜索引擎项目》 Lucene是一个高性能、全文本搜索库,它为开发者提供了在Java应用程序中实现全文检索的工具集。这个名为“lucene搜索引擎项目”的资源,旨在帮助用户更好地理解和应用Lucene来构建...
**正文** ...总结,利用Lucene搜索中文PDF文档涉及多个技术层面,包括中文分词、PDF解析、索引构建、搜索执行和性能优化。通过理解这些关键技术,开发者可以构建出高效、准确的中文PDF文档检索系统。
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
1. **DemoData.java** - 这个文件很可能是包含测试数据或者示例数据的类,用于演示Lucene搜索功能。它可能包含了创建索引所需的文档对象,以及用于搜索的关键词。 2. **MultiPhraseQueryDemo.java** - 这个文件是多...
[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001
Solr、Elasticsearch和Lucene是三个在搜索引擎领域中至关重要的技术,它们共同构建了现代数据检索的基础架构。下面将分别对这三个组件进行详细解释,并探讨它们之间的关系。 **Lucene** Lucene是一个高性能、全文本...
Lucene搜索-引擎开发权威经典pdf+源码第一部分共2个
在这个"ssh+lucene搜索实例"中,我们可以理解为结合了SSH和Lucene两个技术,以实现远程服务器上的全文检索功能。例如,可能有一个需求是在多个远程服务器上存储大量数据,而这些数据需要通过关键词进行快速搜索。在...
本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精炼简洁,恰到好处。 本书包含了必要的理论,但以实践为主。所讲的理论都不是纸上谈兵,都是可以立即付诸实践进行...