您的位置:首页 > 其它

《开发自己的搜索引擎》读书笔记——Lucene搜索

2017-04-12 22:02 232 查看
使用IndexSearcher进行搜索
Lucene搜索相关的API多数都被包含在org.apache.lucene.search包中。其中,最重要的是IndexSearcher类。
(1)、IndexSearcher有三个public的构造函数,均以索引的存放目录作为参数。
(2)、IndexSearcher的最简单使用
IndexSearcher searcher = newIndexSearcher(INDEX_STORE_PATH);
Term t = newTerm("bookname","女");
Query q = new TermQuery(t);
Hits hits =searcher.search(q);
for(int i =0;i<hits.length();i++){
System.out.println(hits.doc(i));
}
(3)几个类
Query:表示一次查询;
Hits:表示一次查询的结果;
Filter:表示对索引中文档集合的过滤器。它使检索在某一个文档集合的子集中进行;
Sort:对索引的结果进行排序的工具;
HitCollector:对检索结果进行选择的一个工具;
Weight:就是权重,表示一次查询时,索引中的某个文档的重要性。

Hits类
(1)、length()取得当前结果集的数量;
doc(intn)取得当前结果集中第n个Document;
floatscore(int n)取得当前结果集中第n个Document的得分;
intid(int n)取得当前结果集中第n个Document的索引内部id值
Iteratoriterator()取得对Hits集合的遍历对象

对搜索结果评分

构建各种Lucene内建的Query对象

TermQuery词条搜索
一个Term对象包括有两个信息。它们分别为词条本身文本内容和词条所在的Field信息。在TermQuery的构造函数中,需要这样一个Term对象来作为其参数。然后,使用IndexSearcher的search(Query)方法得到所需要的结果。

BooleanQuery布尔搜索
在布尔查询的对象中,包含一个子句的集合,各个子句间都是如“与”、“或”这样的布尔逻辑。
BooleanClause.Occur类主要有3种表示,即MUST、MUST_NOT和SHOULD。
SHOULD是一个比较特殊的约束,当它与MUST联用时,它将失去意义。检索
d98d
的结果为MUST子句的检索结果。当它与MUST_NOT联用时,SHOULD的功能就与MUST一样,就退变为MUST和MUST_NOT的查询结果。当SHOULD与SHOULD联用时,它们就表示一种“或”关系。最终检索结果为所有检索子句的检索结果的并集。
BooleanQuery的默认最大子句数量为1024.如果超过了这个数量,Lucene会抛出一个TooManyClauses的异常。但是用户也可以通过提供的接口来修改这个最大子句数量。
子句并非只能进行TermQuery那样的院子查询,也可以进行如BooleanQuery这样的复合类型查询。

RangeQuery范围搜索
查找一定范围内的文档,这种范围可以是时间、日期、数字大小等。

PrefixQuery前缀搜索
比如,到图书馆查找一本书,可能只记得书名的最前面几个字。

PhraseQuery短语搜索
PhraseQuery提供了一种称为“坡度”的参数,它用于表示词组的两个字之间可以插入无关字的个数。该值默认为0,但是可以通过setSlop方法修改这个值。

MultiPhraseQuery多短语搜索
可以对多个短语同时进行检索。每一次add都是一波并列。

FuzzyQuery模糊搜索
可以进行单字的模糊查找,模糊查找所使用的算法被称为levenshtein算法。这种算法在比较两个字串时,将动作分为3种:
          加一个字母(insert);
          删一个字母(delete);
          改变一个字母(substitute)。
两个字串之间进行比较时,就是执行将其中一个字串,转变为另一个字串的操作。每执行一项上述操作,则相应的扣除一定分数。当比较完毕,也就是转变完毕,此时的得分被称为两者之间的距离,也可以叫做模糊度。

WildcardQuery通配符搜索
通常情况下,用“*”表示任意长的字符串,用“?”表示一个单一的字符。

SpanQuery跨度搜索

第三方提供的Query对象:RegexQuery
结合正则表达式。

通过QueryParser转换用户关键字

词条定义。词条与词条之间要用空格隔开;另外有些使用引号包围起来的关键字串均包含两个词条。

在QueryParser中,使用与建立索引时相同的分析器,是为了确保用户在输入、分词时能够和索引中的内容相一致。在QueryParser的构造函数中,要为QueryParser赋一个默认的field。这是因为通常情况下,用户并不知道后台的索引中都有哪些Field,而让用户来指定Field是一个不友好的行为,因此需要告知QueryParser一个默认的Field信息。在用户未指定时,则告知Lucene按默认的Field进行检索。

改变QueryParser默认的布尔逻辑。

短语和QueryParser。
在PharseQuery的最后使用一个“~”来表示其坡度值。

FuzzyQuery的默认匹配度为0.5

建立索引时,如果按照日期表示的字符串来进行索引,那么在RangeQuery时,实际上比较的是字符串的字典顺序。而若首先将日期转化为以毫秒计算的时间,则可以精确地比较两个日期的大小了。建议在使用Lucene时,当遇到日期型数据时,都先使用DateTools进行转换,再进行索引。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: