Solr глубокий пейджинг без сортировки - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующий xml, который проиндексирован в solr:

<doc>
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" >Sharknado 3</field>
<field name="author">moriarti</field>
<field name="price">20.5</field>
</doc>

<doc>
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" >Sharknado</field>
<field name="author">moriarti</field>
<field name="price">18</field>
</doc>

<doc>
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" >Sharknado 2</field>
<field name="author">moriarti</field>
<field name="price">19.5</field>
</doc>

Следующая проблема, с которой я сталкиваюсь, заключается в том, что, когда я выполняю глубокую подкачку, она заставляет меня сортировать по id asc или id desc, а затем яне могу отсортировать по "заголовку".Я попытался использовать поле поиска по умолчанию (df), но результат все еще не соответствует действительности.Не могли бы вы узнать, как я могу это решить, чтобы я мог заказать по названию?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Наконец я решил это, Изучив немного о токенизаторах и попробовав несколько вещей ...

Первый : я изменил solrconfig.xml, чтобы иметь возможность редактировать его вручную. Я добавил:

<schemaFactory class="ManagedIndexSchemaFactory">
    <bool name="mutable">true</bool>
    <str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>

как указано здесь .

Секунда : я изменил в manage-schema.xml следующее для моего поля:

<field name="title" type="text_general"  multiValued="false" indexed="true" stored="true"/>

Третий : Я заказал счет и название следующим образом в solrj:

query.addSort("score", ORDER.desc);
query.addSort("title", ORDER.asc);
query.addSort("id", ORDER.desc);

У меня также есть параметр в solrj:

query.setParam ("df", "title");

Таким образом, он возвращает результаты правильно. Спасибо, что уделили время MatsLindh.

0 голосов
/ 13 ноября 2018

Определение поля (с типом и т. Д.) Входит в вашу схему, а не в XML обновления.

Сортировка по проанализированному TextField также не является хорошей идеей, так как вы не получите желаемого результата. Если вы хотите выполнить поиск по текстовому полю, выполните сортировку по полю string или полю с KeywordTokenizer и нижним регистром фильтра (если вы хотите сделать сортировку нечувствительной к регистру).

Правило состоит только в том, что поле id (или более конкретно - поле uniqueKey, которое может называться как-то иначе, чем id, но обычно это просто id) - должно быть присутствует в порядке сортировки. Он не должен быть первым, он просто должен быть там, чтобы сортировка была стабильной.

sort=title asc, id asc

.. идеально подходит для использования cursorMarks для глубокой подкачки.

Для дальнейшего объяснения после вашего комментария

Tokenizer - это то, что сообщает Solr, как разбить входной текст на так называемые «токены». Токен - это то, против чего проводится совпадение. Токенизатор пробельных символов разделит «это текст» на четыре токена: this, is, a и text. Когда вы ищете только text или this text, происходит тот же процесс, затем сравниваются введенные и сохраненные токены, чтобы увидеть, есть ли совпадение.

Сортировка также выполняется с токенами, поэтому, если вы попытаетесь отсортировать текст «cba», он будет разбит на токены на c, b и a - и это не очень полезно для сортировки, поскольку вы ожидаете, что все, начиная с c, будет отсортировано после b, но теперь у вас есть три токена для документа, указывающие его действительное значение. Этот процесс обычно дает странные и не интуитивные результаты.

Вместо этого используйте поле string, поскольку оно сохраняет ввод как один токен. Если вы храните a b c, весь текст сохраняется как один токен - a b c и не разбивается на более мелкие фрагменты. Это также означает, что вы получите попадания только в том случае, если входной и сохраненный текст совпадают в точности, поскольку это один большой токен (а именно токены определяют совпадения).

Но так как строковое поле не выполняет ничего , вы можете отсортировать a и A как один и тот же символ, вместо того, чтобы сначала сортировать заглавные буквы. Для этого Tokenizer с именем KeywordTokenizer - KeywordTokenizer не разбивает входной текст на токены, а сохраняет все как один токен. Это кажется бесполезным, так как это то же самое, что и поле string, но TextField с Tokenizer позволяет вам присоединять фильтры к цепочке анализа, а строковое поле - нет. Таким образом, вы можете добавить LowercaseFilter в цепочку, и, таким образом, токены, сгенерированные для a и A, будут одинаковыми - a в обоих случаях.

Вы настраиваете типы полей и связанную с ними обработку в schema.xml или через Schema API . Вы можете использовать copyField, чтобы сообщить Solr «все, что входит в это поле, также должно быть добавлено в это другое поле» - таким образом вы можете сделать так, чтобы ваш контент отображался в нескольких полях и обрабатывался по-разному - один из способов поиска (токенизация на например, пробел) и один способ поиска (вообще не размечен).

Синтаксис, который вы использовали для одного из ваших полей в XML-документах, не предназначен для использования в этом контексте - но при определении поля в schema.xml:

<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" />

В вашем документе это должно быть просто:

<field name="title">value</field>

Обработка и параметры будут основаны на типе поля, определенного в schema.xml.

...