Как найти связанные элементы по тегам в Lucene.NET - PullRequest
0 голосов
/ 11 мая 2009

Мои проиндексированные документы имеют поле, содержащее набор идентификаторов, разделенных каналом:

a845497737704e8ab439dd410e7f1328|
0a2d7192f75148cca89b6df58fcf2e54|
204fce58c936434598f7bd7eccf11771

(игнорировать разрывы строк)

Это поле представляет список тегов. Список может содержать от 0 до n идентификаторов тегов.

Когда пользователи моего сайта просматривают определенный документ, я хочу отобразить список связанных документов. Этот список связанных документов должен определяться тегами:

  • В списке «связанных документов» должны отображаться только документы с хотя бы одним совпадающим тегом.
  • Документ с наиболее подходящими тегами должен отображаться в верхней части списка «связанных документов».


Я думал об использовании WildcardQuery для этого, но запросы, начинающиеся с '*', не допускаются.


Есть предложения?

Ответы [ 4 ]

2 голосов
/ 11 мая 2009

Вы можете иметь одно и то же поле несколько раз в документе. В этом случае вы бы добавили несколько полей тегов во время индекса, разделив их на |. Затем, когда вы ищете, вам просто нужно искать в поле «тег».

2 голосов
/ 11 мая 2009

Отложив на минуту возможные варианты использования Lucene для этой задачи (с которой я не слишком знаком) - рассмотрите возможность проверки базы данных LinkDatabase.

Sitecore будет за кадром отслеживать все ваши ссылки на элементы и от них. А поскольку ваши множественные теги действительно (я полагаю) выбраны из мета-иерархии тегов, представленных где-то как элементы Sitecore, - 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

2 голосов
/ 11 мая 2009

Ваш набор идентификаторов, разделенных каналом, должен быть действительно разделен на отдельные поля, когда документы были проиндексированы. Таким образом, вы можете просто сделать запрос для нужного тега, отсортировав по убыванию релевантности.

1 голос
/ 11 мая 2009

Попробуйте этот запрос в поле тега.

+(tag1 OR tag2 OR ... tagN) 

где tag1, .. tagN - теги документа.

Этот запрос вернет документы с хотя бы одним совпадением тега. При подсчете очков автоматически будут отображаться документы с наибольшим количеством совпадений, поскольку окончательный результат представляет собой сумму отдельных результатов.

Кроме того, вам необходимо понять, что если вы хотите найти документы, похожие на теги Doc1, вы найдете Doc1 в верхней части результатов поиска. Итак, обработайте это дело соответственно.

...