- 浏览: 348618 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1334互联网海量用户和海量信息面前,信息不再是稀缺的事物,反 ... -
推荐系统
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 1673机器学习方法在搜索引 ... -
深入搜索引擎--查询(Query)
2012-03-12 22:56 24001.Query的数据分析 Que ... -
lucene.net 查询与添加索引的同步问题
2008-03-21 09:59 1480Lucene.Net 遵循以下规则:1. 允许任意多的读 ... -
Lucene基本知识
2008-04-22 14:56 816本文仅记录一些简单的使用方法,供初学者参考。以下例子采用 ... -
lucene的多关键词或查询
2008-04-25 15:05 2161//使用布尔查询 BooleanQuery bquery = ... -
垂直搜索数据源问题
2008-04-28 12:53 811垂直搜索与web搜索有很大的不同,一个非常大的区别在于对 ... -
百度 google的垂直搜索
2008-04-29 13:13 878我们发现在 ...
相关推荐
Lucene搜索引擎开发权威经典(附盘源码)【于天恩】.zip
本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精炼简洁,恰到好处。 本书包含了必要的理论,但以实践为主。所讲的理论都不是纸上谈兵,都是可以立即付诸实践进行...
LUCENE搜索引擎基本工作原理 详细介绍了搜索引擎的工作原理
07.Lucene搜索实战1 共4页 08.Lucene搜索实战2 共5页 09.Lucene搜索深入实战1 共5页 10.Lucene搜索深入实战2 共11页 11.Lucene搜索深入实战进阶1 共4页 12.Lucene搜索深入实战进阶2 共9页 13.Lucene搜索深入实战进阶...
07.Lucene搜索实战1 共4页 08.Lucene搜索实战2 共5页 09.Lucene搜索深入实战1 共5页 10.Lucene搜索深入实战2 共11页 11.Lucene搜索深入实战进阶1 共4页 12.Lucene搜索深入实战进阶2 共9页 13.Lucene搜索深入实战进阶...
07.Lucene搜索实战1 共4页 08.Lucene搜索实战2 共5页 09.Lucene搜索深入实战1 共5页 10.Lucene搜索深入实战2 共11页 11.Lucene搜索深入实战进阶1 共4页 12.Lucene搜索深入实战进阶2 共9页 13.Lucene搜索深入实战进阶...
07.Lucene搜索实战1 共4页 08.Lucene搜索实战2 共5页 09.Lucene搜索深入实战1 共5页 10.Lucene搜索深入实战2 共11页 11.Lucene搜索深入实战进阶1 共4页 12.Lucene搜索深入实战进阶2 共9页 13.Lucene搜索深入实战进阶...
07.Lucene搜索实战1 共4页 08.Lucene搜索实战2 共5页 09.Lucene搜索深入实战1 共5页 10.Lucene搜索深入实战2 共11页 11.Lucene搜索深入实战进阶1 共4页 12.Lucene搜索深入实战进阶2 共9页 13.Lucene搜索深入实战进阶...
[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001
这是基于lucene搜索引擎的java源码,里面数据库,包括建立索引,增量索引一应俱全,希望对大家有作用。
[Lucene搜索引擎开发权威经典]
Lucene搜索-引擎开发权威经典pdf+源码第一部分共2个
本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精炼简洁,恰到好处。 本书包含了必要的理论,但以实践为主。所讲的理论都不是纸上谈兵,都是可以立即付诸实践进行...
用Lucene框架实现的搜索引擎,供大家参考。
lucene 搜索中文文档,写的比较详细
Lucene搜索引擎开发权威经典 光盘 于天恩 著 中国铁道出版社出版 2008-10 这本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精练简洁,恰到好处。 本书共包括16章,...
Lucene搜索引擎1Lucene搜索引擎1Lucene搜索引擎1Lucene搜索引擎1
一个基于LUCENE搜索引擎项目例子一个基于LUCENE搜索引擎项目例子一个基于LUCENE搜索引擎项目例子
Lucene搜索引擎1Lucene搜索引擎1Lucene搜索引擎1Lucene搜索引擎1Lucene搜索引擎1Lucene搜索引擎1
ssh+lucene搜索实例