如何在Lucene.NET中按标签查找相关项目

时间:2009-05-11 13:55:20

标签: search lucene sitecore

我的索引文档有一个字段,其中包含一组以管道分隔的ID:

a845497737704e8ab439dd410e7f1328|
0a2d7192f75148cca89b6df58fcf2e54|
204fce58c936434598f7bd7eccf11771

(忽略换行符)

此字段代表标签列表。该列表可能包含 0 n 标记ID。

当我的网站用户查看特定文档时,我想显示相关文档的列表。 此相关文档列表必须由标记确定:

  • 只有具有至少一个匹配标记的文档才会出现在“相关文档”列表中。
  • 具有最匹配标签的文档应显示在“相关文档”列表的顶部。


我正在考虑使用WildcardQuery,但不允许以'*'开头的查询。


有什么建议吗?

4 个答案:

答案 0 :(得分:2)

在对文档编制索引时,您的以管道分隔的ID集应该已经分成单独的字段。这样,您可以简单地对所需标记进行查询,按相关性降序进行排序。

答案 1 :(得分:2)

您可以在文档中多次使用相同的字段。在这种情况下,您可以通过拆分|来在索引时添加多个“tag”字段。然后,当您搜索时,您只需要搜索“标记”字段。

答案 2 :(得分:2)

暂时搁置Lucene用于此任务的可能用途(我不太熟悉) - 考虑检查LinkDatabase。

Sitecore将在幕后跟踪您对项目的所有引用。并且由于您的多个标签确实(我假设)从某个地方表示为Sitecore Items的标签的元层次结构中选择 - LinkDatabase将能够告诉您引用它的所有项目。

在某种伪代码模型中,这将成为

for each ID in tags
  get all documents referencing this tag
  for each document found
    if master-list contains document; increase usage-count
    else; add document to master list
sort master-list by usage-count descending

请原谅我,我不是更精确,但在现阶段无法模拟一个完整的例子。

您可以在此处找到有关LinkDatabase的文章http://larsnielsen.blogspirit.com/tag/XSLT。请注意,如果您使用TreeListEx字段标记文档,则早期版本的Sitecore中存在已知缺陷。记录在这里:http://www.cassidy.dk/blog/sitecore/2008/12/treelistex-not-registering-links-in.html

答案 3 :(得分:1)

在标记字段上尝试此查询。

+(tag1 OR tag2 OR ... tagN) 

其中tag1,.. tagN是文档的标记。

此查询将返回至少包含一个标记匹配的文档。评分会自动显示最高分数的文件,因为最终分数是个别分数的总和。

此外,您需要意识到,如果您要查找类似于Doc1标签的文档,您会发现Doc1位于搜索结果的顶部。所以,相应地处理这个案子。