2010-03-25 3 views
0

Я работаю с NHibernate, NHibernate.Search и Lucene.Net для улучшения поисковой системы, используемой на веб-сайте, который я разрабатываю.Манипулировать оценку/ранг по результатам запроса от NHibernate.Поиск

В основном, я использую его для поиска содержимого документов спецификации корпораций. Это не следует путать с понятием документа Lucene: в моем случае документ спецификации (который я буду называть «specdoc») может содержать много страниц, а содержание этих страниц - это те, которые фактически индексированы (таким образом, сами страницы являются теми, которые попадают в концепцию документов Луцены). Таким образом, страницы принадлежат specdoc, которые, в свою очередь, принадлежат корпорации (так, корпорация может иметь много specdocs). Я использую NHibernate.Search «IndexEmbedded» и «ContainedIn» атрибуты для связывания страниц с их specdoc и specdocs с их корпорациями, поэтому я могу запросить термины на страницах specdoc и вернуть Lucene/NH.Search либо сами страницы , specdocs или корпораций, которые соответствуют запросу на страницах. Я могу запросить этот способ и получить ранжированные результаты, таким образом представляя результаты (то есть корпорации, specdocs или страницы) по релевантности, что отлично.

Но теперь мне нужно что-то еще. В частности, в случае, когда я запрашиваю условия и возвращаю NH.Search корпорации, которые соответствуют, мне нужно вручную/искусственно настроить оценку некоторых результатов, потому что есть корпорации, которые я хочу показать вверху результата set - подумайте о «спонсированных результатах».

Я собираюсь сделать это в своем приложении, возможно, создав таблицу сущностей/баз данных, которая содержит ассоциацию с сущностью корпорации и значение повышения балла. Но я не знаю, как передать это Lucene и поднять его результаты в поисковое время. Первоначально я думал о получении класса сходства для этого, но не похоже, что сходство можно использовать для изменения наборов результатов во время поиска. Согласно this page, похоже, что мне нужно, чтобы возиться с весом или скорингом. Но документы немного поверхностны, поскольку нет примеров того, как реализовать собственный счет, а тем более интегрировать его с NH.Search.

Итак, кто-нибудь знает, как это сделать, или укажите мне какую-нибудь документацию или рабочий пример о том, как сделать что-то подобное?

Спасибо!

ответ

0

Из того, что я понимаю, вы просто хотите установить повышение в время запроса, а не время индекса. Это можно сделать легко. Когда вы создаете запрос, вы можете установить повышение. Объект Query содержит свойство SetBoost, которое позволяет вам увеличивать документы, соответствующие целому запросу. Это полезно, когда вы используете два терминальных запроса и хотите, чтобы один из них был повышен. Но, если вы используете что-то вроде QueryParser для создания запросов, есть синтаксис для синтаксического анализатора запросов, чтобы установить ускорение для этих терминов. Подробнее об этом здесь http://lucene.apache.org/java/2_9_0/queryparsersyntax.html#Boosting%20a%20Term. Теперь, если вы используете синтаксический анализатор запросов, вы можете использовать некоторое регулярное выражение или настроить строку синтаксического анализатора запроса, чтобы добавить дополнительный символ, чтобы увеличить срок, или вы можете задуматься о создании собственного анализатора запросов, что добавит повышение, когда оно решит он должен быть добавлен. Я создал свой собственный синтаксический анализатор запросов, потому что это не так сложно. Вот некоторая информация об этом http://openedu.ossreleasefeed.com/tutorials/apache-lucene-extending-the-queryparser/

+0

Да, я подумал о том, чтобы настроить запрос, чтобы получить результаты, которые мне нужны, но я не мог этого сделать, по крайней мере, я не знаю, как это сделать. Вот сделка: я храню/индексирую, а также текстовое содержимое страниц specdoc, идентификаторы спецификаций и корпораций, связанные с контентом. Так что, если я запрашиваю что-то вроде этого: SpecDoc.Pages.content: белый и SpecDoc.CorpID: 32 возвращает корпорации с specdoc страницы, содержащие «белый» в содержании, исключительно от корпорации с ID 32. –

+0

сейчас , экстраполируя это, это приблизится к поведению, которое мне нужно: SpecDoc.Pages.content: white OR SpecDoc.CorpID: 64^100 - Но это явно не совсем то, что мне нужно: это принесет результаты от корпораций с идентификатором 64, увеличившись до 100 баллов, даже если их страницы не содержат «белых». –

+0

Что мне нужно, это повышение баллов на CorpID, если их страницы содержат «белый», в противном случае они не должны отображаться на результатах вообще. Теперь либо мое понимание синтаксиса запросов Lucene отсутствует (моя ссылка уже была на странице, которую вы опубликовали), либо мне нужно что-то еще. У меня нет времени, чтобы прочитать ваше сообщение в блоге с вниманием, поэтому я рассмотрю его позже и посмотрю, полезно ли это. Благодаря! –

Смежные вопросы