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

  1. 使用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:就是权重,表示一次查询时,索引中的某个文档的重要性。

  2. Hits类

    (1)、length()取得当前结果集的数量;

    doc(intn)取得当前结果集中第n个Document;

    floatscore(int n)取得当前结果集中第n个Document的得分;

    intid(int n)取得当前结果集中第n个Document的索引内部id值

    Iteratoriterator()取得对Hits集合的遍历对象

  3. 对搜索结果评分

  4. 构建各种Lucene内建的Query对象

  1. TermQuery词条搜索

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

  2. BooleanQuery布尔搜索

    在布尔查询的对象中,包含一个子句的集合,各个子句间都是如“与”、“或”这样的布尔逻辑。

    BooleanClause.Occur类主要有3种表示,即MUST、MUST_NOT和SHOULD。

    SHOULD是一个比较特殊的约束,当它与MUST联用时,它将失去意义。检索的结果为MUST子句的检索结果。当它与MUST_NOT联用时,SHOULD的功能就与MUST一样,就退变为MUST和MUST_NOT的查询结果。当SHOULD与SHOULD联用时,它们就表示一种“或”关系。最终检索结果为所有检索子句的检索结果的并集。

    BooleanQuery的默认最大子句数量为1024.如果超过了这个数量,Lucene会抛出一个TooManyClauses的异常。但是用户也可以通过提供的接口来修改这个最大子句数量。

    子句并非只能进行TermQuery那样的院子查询,也可以进行如BooleanQuery这样的复合类型查询。

  3. RangeQuery范围搜索

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

  4. PrefixQuery前缀搜索

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

  5. PhraseQuery短语搜索

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

  6. MultiPhraseQuery多短语搜索

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

  7. FuzzyQuery模糊搜索

    可以进行单字的模糊查找,模糊查找所使用的算法被称为levenshtein算法。这种算法在比较两个字串时,将动作分为3种:

              加一个字母(insert);

              删一个字母(delete);

              改变一个字母(substitute)。

    两个字串之间进行比较时,就是执行将其中一个字串,转变为另一个字串的操作。每执行一项上述操作,则相应的扣除一定分数。当比较完毕,也就是转变完毕,此时的得分被称为两者之间的距离,也可以叫做模糊度。

  8. WildcardQuery通配符搜索

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

  9. SpanQuery跨度搜索

  1. 第三方提供的Query对象:RegexQuery

    结合正则表达式。

  2. 通过QueryParser转换用户关键字

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

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

  3. 改变QueryParser默认的布尔逻辑。

  4. 短语和QueryParser。

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

  5. FuzzyQuery的默认匹配度为0.5

  6. 建立索引时,如果按照日期表示的字符串来进行索引,那么在RangeQuery时,实际上比较的是字符串的字典顺序。而若首先将日期转化为以毫秒计算的时间,则可以精确地比较两个日期的大小了。建议在使用Lucene时,当遇到日期型数据时,都先使用DateTools进行转换,再进行索引。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值