1. 为什么需要搜索

  为什么需要高效的、准确的搜索? 你说呢?

 

2. 怎么样快速搜索

  这个道理很简单。为什么你从《现代汉语词典》中找一个词相当快速,而从一本小说中找起来费劲?

  词典是按一定顺序编排过的。那么,如果我给小说的每个词都编个目录来说明在哪些页码能找到它们呢?

  好吧,编排目录需要花点时间对吗?但是一次性编排完了,以后找起来就会很方便而且不用每次查找都再编排目录了。

 

3. Lucene的结构

  其实,Lucene只做两件事:索引、搜索

  索引,就是编目录的过程。它的本质目的就是把杂乱无章的原始数据(可能来自word,txt,网页,pdf等)编排成有序的数据结构;

  搜索,就是查找这个目录的过程。小学时候学过怎样查字典吧!按音序查、按部首查,Lucene的索引怎么查?放心,它很简单!

 

  至于Lucene的系统结构、源码结构,可以参考http://www.lucene.com.cn/about.htm#_Toc43005313

  看多了未必懂。

 

4. 索引过程

  1) 获取内容

    这一步是确定目标!就是你要索引什么东西,也就是将来你要从哪些内容里搜索!

    你想索引一本《红与黑》,自然能搜到“于连”,但是你若搜索“郭富城”,可能就要悲剧了,是的,“B+侦探”应该也搜不到!

    很遗憾的是,这一步不属于Lucene的范畴,Lucene没有义务去帮你解析XML,帮你解析PDF,甚至是个txt,你也应该使用JavaAPI来做此事!

    事实上,Lucene只认识两个东西:String 和 Reader 对象,如何生成这两个对象,它不关心。

    不过别灰心,很多其它框架可以帮我们完成"获取内容"的过程。即便我们的目标是互联网,也有开源的爬虫帮我们获得它们。

  2) 创建文档

    文档(Document),可以把它想像成一个抽象的信息集合。它可以对应着一本书,也可以对应一本书中的每一章。具体怎么设计要结合你的应用。

    文档中可以包含若干域(Field),你可以把它们设计成一本书的: "书名"、"内容"、"作者"、"出版日期"等,也可以设计成一章中的"标题"、"小节"、"内容"等

    如何设计,这由你来决定!你只管把你设计好的图纸交给Lucene,剩下的他来做。

  3) 分析文档

    这一步负责把文本拆分成一个一个的词元(token),也就是分词的过程。

    看过百度讽刺谷歌的广告的同学都知道,就是把"我知道你不知道我知道你不知道我知道你不知道"拆成一个个词的过程,知道不?

  4) 索引文档

    分析完了就可以索引了。这一步完全由Lucene内部来完成。你只需要调用它简易的API即可。

 

5. 搜索过程

  1) 用户接口(UI)

    就是给用户做个小框框,让他输入内容,然后搜到他要的结果。

    UI的设计一定要简易,要让你的不懂计算机的上帝们能够快速的上手使用。毕竟他们能看到的就这么多,你之前做的再多(如索引过程)他们都不知道。

  2) 创建查询

    通过UI得到了用户的搜索请求后,要把它抽象出来,比如构造成Query对象。

    Query对象可以理解成一堆查询信息:仅查找在标题中包含"美女"而且不包含"帅哥"的内容

  3) 搜索查询

    就是把符合上一步的查询条件的结果找出来,然后排个序。

    有三种常见的查询模型:Pure boolean model    Vector space model    Probabilistic model

    Lucene通过前两种方式实现搜索。

  4) 渲染结果集

    这一步负责把搜索到的内容展示给你的上帝看!

 

6. 其它

  你应该认识到,完整的搜索引擎通常还要包含更多复杂的内容,比如权限控制问题。

  领导会告诉你哪些内容可以被索引,哪些不能。

  你可以用Lucene把《红与黑》索引完,让下属搜到它。但是千万别把领导的《金瓶梅》也公布出去。

  再复杂一点的需求可能是:两本书都能被索引,但是后者只能被公务员搜到!