有关Lucene的Payload的相关内容,可以参考如下链接,介绍的非常详细,值得参考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-lucene-pl/
http://www.lucidimagination.com/blog/2009/08/05/getting-started-with-payloads/
例如,有这样的一个需求:
现在有两篇文档内容非常相似,如下所示:
文档1:egg tomato potato bread
文档2:egg book potato bread
现在我想要查询食物(foods),而且是查询关键词是egg,如何能够区别出上面两个文档哪一个更是我想要的?
可以看到上面两篇文档,文档1中描述的各项都是食物,而文档2中的book不是食物,基于上述需求,应该是文档1比文档2更相关,在查询结果中,文档1排名应该更靠前。通过上面
http://www.lucidimagination.com/blog/2009/08/05/getting-started-with-payloads/中给出的方法,可以在文档中,对给定词出现在文档的出现的权重信息(egg在文档1与文档中,以foods来衡量,文档1更相关),可以在索引之前处理一下,为egg增加payload信息,例如:
文档1:egg|0.984 tomato potato bread
文档2:egg|0.356 book potato bread
然后再进行索引,通过Lucene提供的PayloadTermQuery就能够分辨出上述egg这个Term的不同。在Lucene中,实际上是将我们存储的Payload数据,如上述“|”分隔后面的数字,乘到了tf上,然后在进行权重的计算。
下面,我们再看一下,增加一个Field来存储Payload数据,而源文档不需要进行修改,或者,我们可以在索引之前对文档进行一个处理,例如分类,通过分类可以给不同的文档所属类别的不同程度,计算一个Payload数值。
为了能够使用存储的Payload数据信息,结合上面提出的实例,我们需要按照如下步骤去做:
第一,待索引数据处理
例如,增加category这个Field存储类别信息,content这个Field存储上面的内容:
文档1:
new Field("category", "foods|0.984 shopping|0.503", Field.Store.YES, Field.Index.ANALYZED)
new Field("content", "egg tomato potato bread", Field.Store.YES, Field.Index.ANALYZED)
文档2:
new Field("category", "foods|0.356 shopping|0.791", Field.Store.YES, Field.Index.ANALYZED)
new Field("content", "egg book potato bread", Field.Store.YES, Field.Index.ANALYZED)
第二,实现解析Payload数据的Analyzer
由于Payload信息存储在category这个Field中,多个类别之间使用空格分隔,每个类别内容是以“|”分隔的,所以我们的Analyzer就要能够解析它。Lucene提供了DelimitedPayloadTokenFilter,能够处理具有分隔符的情况。我们的实现如下所示:
package