Сортировка по индивидуальным оценкам в Solr не сортирует последовательно - PullRequest
0 голосов
/ 29 сентября 2011

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

Сначала я определяю поле оценки:

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
<field name="score" type="sint" stored="true" multiValued="false" />

ЗатемЯ перестраиваю индекс, вставляя оценку для каждого документа.Чтобы выполнить запрос, я использую что-то вроде этого:

(text:hello)+_val_:"score"

Теперь я ожидаю, что документы вернутся, отсортированные по полю «оценка», но вместо этого я получаю:

<doc>
  <int name="score">566</int>
  <str name="text">SF - You lost me at hello...</str>
</doc>
<doc>
  <int name="score">41</int>
  <str name="text">hello</str>
</doc>
<doc>
  <int name="score">77</int>
  <str name="text">
    CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM
  </str>
</doc>
<doc>
  <int name="score">0</int>
  <str name="text">Hello Hello Hello</str>
</doc>

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

Я пробовал IntField вместо SortableIntField, иЯ попытался поместить "sort = score desc" в качестве параметра запроса, без изменений в поведении.

Я делаю что-то не так или просто неправильно понимаю смысл использования val : "оценка "в моем запросе?

РЕДАКТИРОВАТЬ: я попытался переименовать поле" оценка "в" популярность "и получил тот же результат.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

поле оценки используется Solr для внутреннего использования, поэтому не рекомендуется задавать поле с тем же именем поля.
вы можете попробовать определить поле с другим именем поля, и обе указанные вами опции должны работатьхорошо.

Редактировать - это то, что у меня есть, и отлично работает (Solr 3.3)

Схема -

Тип поля -

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>

Поле -

<field name="popularity" type="int" indexed="true" stored="true" />

Данные -

<add>
    <doc>
      <field name="id">1007WFP</field>
      <field name="popularity">566</field>
      <field name="text">SF - You lost me at hello...</field>
    </doc>
    <doc>
      <field name="id">2007WFP</field>
      <field name="popularity">41</field>
      <field name="text">hello</field>
    </doc>
    <doc>
      <field name="id">3007WFP</field>
      <field name="popularity">77</field>
      <field name="text">
        CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM
      </field>
    </doc>
    <doc>
      <field name="id">4007WFP</field>
      <field name="popularity">0</field>
      <field name="text">Hello Hello Hello</field>
    </doc>
</add>

Запрос -

http://localhost:8983/solr/select?q=*:*&sort=popularity%20desc

Результаты: -

<result name="response" numFound="4" start="0">
  <doc>
    <str name="id">1007WFP</str>
    <int name="popularity">566</int>
  </doc>

  <doc>
    <str name="id">3007WFP</str>
    <int name="popularity">77</int>
  </doc>
  <doc>
    <str name="id">2007WFP</str>
    <int name="popularity">41</int>

  </doc>
  <doc>
    <str name="id">4007WFP</str>
    <int name="popularity">0</int>
  </doc>
</result>
0 голосов
/ 06 мая 2013

Взлом _val_ фактически добавляет поле «популярность» к обычно вычисляемому количеству очков solr.

Так, если у вас есть популярность = 41 для документа A и популярность = 77 для документа B, но документ A набирает более 36 баллов лучше, чем B для ключевого слова "привет", тогда они будут отсортированы поA перед B.

Используйте поле «сортировка» (как вы это сделали), которое полностью переопределяет нормальную сортировку по баллам.

Альтернативным способом может быть использование запроса фильтра (параметр fq вместоq), который фильтрует соответствующий документ без вычисления какой-либо оценки, а затем использует _val_, чтобы определить формулу оценки.Поскольку при запросах фильтра все извлеченные документы будут иметь нулевую оценку, _val_ не будет затронут и будет вести себя так, как вы ожидали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...