nutch搜索时进行了querys优化处理,包括缓存等。
为了对实际的搜索过程进行分析,让我们来对现成的搜索代码进行分析。
一。流程
二。分析
1.initiated nutch query
利用Query来parse生成,具体分成三步:
*NutchAnalysis.parseQuery():如果根据指定语言没有找到指定analyzer,则使用默认的NutchdocumentAnalyzer。其实这个default analyzer是一个encapsulator,如果是anchor则使用AnchorAnalyzer,否则使用ContentAnalzyer。
然后,利用javacc定义好的Lexical analyzer来对query进行normalization,这部分形如一般的查询系统一样必要,所以不进行討論。
最后 返回 一个Nutch query。
*fixed query:对上述的query中unkown fields进行phase query转换。
*initiate query conditions 包括形如start offset ,hitsPerSite,sort etc。
2.query filters
根据已经注册的query plugins进行filter。其中BasicQueryFilter是必须的,fitler时有一个步骤不是很明确:
addSloppyPhase() 从名字上看好像是说可选的phase,而且在最后看到对于每个field,它的原则都 是Occur.SHOULD。所以我猜测,它将所有的terms合并成一个phase query是为了提高查询的精确度,that is context related! right ?
这个可以在大量数据集的情况下可以调试比较。
3.optimized query
有意思的是,Nutch的reverse与否使用 不同的查询策略。如果是ascending,则使用Limit来限制;否则直接使用lucene的query。觉得有点可疑 ,为什么要这样区分 而不是同一使用limit?这是为了减少内存使用?ascending容易实现?
觉得都不是太对。
4.retireve results
index其实就是一个相关性检测和过滤检索前提,后面就是依据index no,uniquekey,url等metadata进行ParseText,ParseData等数据的处理,这步要利用hadoop来检索。
Fragment: 代表个基本的text元素
Highlight,Ellipsis:继承自fragment
以上三个是由BasicSummarier处理的。
而最終的显示是由Summary.toHTML()处理。