一。索引时analyzer
我们知道,在Indexer进行index时,是利用IndexOutputFormat进行rewrite的,其中write filters有一个:LuceneWriter。它是这样处理的:
*如果crawl过程index filters有添加lang field,那么在此时是依据此它进行retrieve plugin related NutchAnalyzer;否则
*使用default NutchDocumentAnalyzer。默认地,它使用了ContentAanlzyer and AnchorAnalyzer,但这两个都是不理想的,所以本来是需要改造的。即使用self-defined analzyer instead of it.
总结以上二点,就是默认的使用了self-defined analyzer to index.
要做到像gg这样的,可以在index是添加一上lang filed就行了。
二。搜索query 时analyzer
我们在调用Query生成一个Nutch's query时,需要调用Query.parse(keywrod,lang,conf)方法,同样这时也产生了一个anayzer depended upon the lang。然后传递给由javacc定义的NutchAnalysis来parse,并在compound阶段进行tokenized string.
但发现只有在WORD,ACRONYM,SIGRAM时才触发。
所以这个与index时是同一个的。
三。highlight时analyzer
在搜索时取回summary时已经进行了smmary filter.如FetchSegments.getSummary(hits,query)。
(注意这个query是利用二中的query,所以如果这里的query对应的analyzer如果与具体的summary filter中的不对应时,可以引起问题。)
由于系统取回具体的plugin时只对第一个有效,所以即便在xml中添加了多个也是没有有的,因为原则上不需要像其它filters一样要处理多次。这里默认使用BasicSummarier(另外还有一个LuceneSummarier)。其中它指定了NutchDocumentAnalyzer来进行tokenized.表明这与customerized analyzer plugin是有区别的。
综合分析,index与search是为了符合传统意义上的搜索匹配原则,所以使用的是同一个analyzer;
而highlighht是系统内置的另外一个实现。当然了,如果没有具体的langage specailed analyzer时,将统一使用系统的,即NutchDocumentanalyzer。
我想,之所以有这个区别,这对很多大型综合搜索引擎来说,这是类似的。这是为了更加贴近用户的体验也罢。