2011-01-04 2 views
2

У меня есть solr-индекс, доступ к которому осуществляется с помощью SolrNet, и я хотел бы получить индекс (позицию) конкретного документа в результатах, не возвращая весь набор результатов.Результаты поиска Solr и получение позиции документа

Подробнее ... запрос возвращает ~ 30 000 документов и упорядочивается целым полем. Уникальное ключевое поле содержит Guid, и я хотел бы найти, где в результатах конкретный документ, основанный на уникальном ключе, только возвращая первые 10 результатов.

Этот индекс был первоначально реализован в простой старой Lucene, и эта задача была достигнута с помощью двух запросов: одна для получения идентификатора документа lucene документа, о котором я хочу знать, а затем второй, который возвращает весь набор результатов. Затем я могу использовать идентификатор документа, чтобы найти, где документ отображается в полном наборе результатов, но затем только перечислять документы для первого. 10.

Есть ли способ достичь того, что я получаю после Solr, не возвращаясь все 30000 результатов (даже ограничение этого на Guid только кажется слишком медленным)?

Благодаря

+1

Что вы хотите достичь этим? Какова основная проблема? –

+0

Идентификаторы Lucene doc являются деталями реализации, Solr не раскрывает их. –

+0

Результаты представляют собой разбитый список пользователей, каждый из которых имеет числовое поле «точки». Результаты должны быть упорядочены по этому полю «points», и тогда мне нужно знать, в какой позиции пользователь X появляется в результатах. Поэтому над списком с разбивкой по страницам я могу отобразить «Ты на третьем месте» или «Ты на 321-м месте». Если текущий пользователь находится на первой странице результатов отлично, но проблема возникает, если это не так. Благодарю. – robinbetts

ответ

5

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

поэтому, если вы знаете, что пользовательская точка 10.000, вы можете сделать запрос: game: tetris points [MaxInt TO 10000], а если результат 375, вы бы знали, что ваш пользователь находится в ранге 375.

+0

Гений! Это именно то, что мне нужно. Я отказался от этого, а потом вернулся к проблеме через месяц, мой вопрос появился на Google, и я увидел ваш ответ, которого я раньше не видел. Благодаря! – robinbetts

0

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

Lucene Doc Идентификаторы не являются стабильными, я не рекомендовал бы использовать их для этого (см this, this, this), и Solr не выставляет их в любом случае.