«2d Search» в Solr или как получить лучший предмет из многозначного поля 'items'? - PullRequest
0 голосов
/ 07 июня 2010

Название немного неловкое, но я не смог найти лучшего. Моя проблема заключается в следующем:

У меня есть несколько пользователей, которые хранятся в виде документов, и я храню несколько пар ключ-значение или элементы (которые имеют идентификатор) для каждого документа. Теперь, если я применю выделение с помощью hl.snippets = 5, я могу получить первые 5 элементов. Но у каждого пользователя может быть несколько сотен предметов, поэтому

  • вы не получите 5 самых важных предметов. Вы получите первый 5 предметов ...

Другая проблема заключается в том, что

  • выделенный текст не будет содержать идентификатор, поэтому получение дополнительной информации о выделенном тексте элемента выглядит ужасно.

Пример, в котором элементы являются электронными письмами:

user1 has item1 { text:"developers developers developers", id:1, title:"ms" }
          item2 { text:"c# development",                   id:2, title:"nice!" }
          ...
          item77 ...

user2 has item1 { text:"nice restaurant", id:3, title:"bla"}
          item2 { text:"best cafe",       id:4, title:"blup"}
          ...
          item223 ...

Теперь, если я использую выделение для текстового поля и запрос к «ресторану», я получаю user2 и текст nice <b>restaurant</b>. Но как я могу определить идентификатор выделенного текста для отображения, например, название этого предмета? И что произойдет, если в конце списка товаров будут перечислены более важные предметы? Выделение не будет отображать те ...

Так, как я могу найти лучшие пункты документа с несколькими такими пунктами?

Я добавил свои два вывода в качестве ответов, но, как я укажу, у каждого из них есть свои недостатки.

Может ли кто-нибудь указать мне на лучшее решение?

Ответы [ 3 ]

1 голос
/ 07 июня 2010

Вы можете использовать два индекса: users-> items, как описано в вопросе, и индекс с «чистыми элементами», ссылающимися на пользователя.

Затем вам потребуется 2 запроса (по этой причине я назвал вопрос «2d Search in Solr»):

  1. запросить индекс пользователя => список, например 10 пользователей
  2. запросить индекс предметов для каждого пользователя из 1. step => best items

Предположим следующий пример:

письма пользователя userA "ресторан X плохой, но ресторан X дешевый", "другая тема", "другая тема B" и

письма пользователя userB: «ресторан X не хорош», «вновь посетил ресторан X, и теперь все было в порядке», «снова в ресторане X, и я думаю, что он лучший».

Теперь я запрашиваю индекс пользователя для «restaurant X», и первым пользователем будет userB, чего я и хочу. Если бы я запросил только предметный индекс, я бы получил item1 менее значимого пользователя A.

Недостатки:

  • плохая производительность, потому что вам понадобится один запрос к индексу пользователя и, например, Еще 10, чтобы получить наиболее подходящие предметы для каждого пользователя.
  • поддержание двух индексов.

Обновление , чтобы избежать многих запросов, я попытаюсь сделать следующее: используя индекс пользователя, чтобы получить некоторые выделенные фрагменты, а затем предлагая кнопку «получить соответствующие элементы» для каждого пользователя, которая затем инициирует запрос к предметный указатель.

1 голос
/ 08 июня 2010

Одно из моих практических правил при разработке схем Solr: документ - это то, что вы будете искать.

Если вы хотите искать «элементы», то эти «элементы» являются вашими документами.То, как вы храните другие вещи, такие как «пользователи», является второстепенным.Таким образом, «пользователи» могут находиться в другом индексе, как вы упомянули, они могут быть «денормализованы» (например, их информация дублируется в каждом документе), в реляционной базе данных и т. Д. В зависимости от доступности СУБД, сколько «пользователей» существует, какмного полей, которые есть у этих «пользователей» и т. д.

РЕДАКТИРОВАТЬ: теперь вы объясняете, что «элементы» - это электронные письма, а возможный поиск - «ресторан Х», и вы хотите найти лучшие «элементы» (электронные письма).).Поэтому документом является электронная почта.Схема может быть такой простой: (id, title, text, user).

Вы можете включить подсветку для получения фрагментов полей 'text' или 'title', соответствующих запросу 'restaurant X'.

Если вы хотите предоставить конечному пользователю информацию о пользователях, которые писали о «ресторане Х», вы можете указать в поле «пользователь».Тогда конечный пользователь увидит, что Джон написал 10 электронных писем о «ресторане Х», а Роберт написал 6. Конечный пользователь думает: «Этот парень Джон должен знать много об этом ресторане», поэтому он углубляется в поиск по «ресторану х».'с фильтром запроса user:John

0 голосов
/ 07 июня 2010

Вы можете использовать свернутое исправление и сохранять каждый элемент как отдельный документ, ссылающийся на пользователя.

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

См. Часть «Предположим, следующий пример:» во втором ответе.

...