Сортировать результаты поиска по возрастанию многозначного поля в Solr - PullRequest
2 голосов
/ 15 мая 2019

Я использую Solr version 6.6.0.У меня есть схема заголовка (text_general), описания (text_general), id (целое число).Когда я ищу ключевое слово, чтобы вывести результаты в порядке возрастания заголовка, мой код возвращает ошибку Не удается отсортировать по многозначному полю: title.

Я попытался установить сортировку, используяследующие 3 метода

SolrQuery query = new SolrQuery();
1. query.setSort("title", SolrQuery.ORDER order);
2. query.addSort("title", SolrQuery.ORDER order);
3. SortClause ab = new SolrQuery.SortClause("title", SolrQuery.ORDER.asc);
   query.addSort(ab);

но все они возвращают одну и ту же ошибку

Я нашел решение, сославшись на этот ответ

В нем говоритсяиспользовать функции min / max.query.setSort (field ("pageTitle", min), ORDER.asc);это то, что я пытаюсь установить в качестве запроса, я не понимаю, какие аргументы используются здесь.

Это зависимость maven, которую я использую

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.5.1</version>
</dependency>

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Если title на самом деле не является многозначным - может ли ваше сообщение иметь несколько заголовков - вы должны определить его как multiValued="false" в вашей схеме . Однако есть вторая проблема - поле типа по умолчанию text_general не подходит для сортировки, поскольку оно генерирует несколько токенов, по одному для каждого слова в названии. Это полезно для поиска, но при сортировке дает странные и неинтуитивные результаты.

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

1 голос
/ 15 мая 2019

Первое, что нужно проверить, действительно ли вам нужно, чтобы это поле заголовка было многозначным, или у ваших документов действительно есть несколько заголовков?Если нет, вам просто нужно исправить определение поля, установив multivalued="false".

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

Допустим, нам нужно отсортировать заданный набор результатов по заголовку (в алфавитном порядке), сначала используя однозначное поле заголовка:

# Unsorted
"docs": [
  { "id": "1", "title": "One" },
  { "id": "2", "title": "Two" },
  { "id": "3", "title": "Three" },
]

# Sorted
"docs": [
  { "id": "1", "title": "One" },
  { "id": "3", "title": "Three" },
  { "id": "2", "title": "Two" },
]

# -> ok no problem here

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

# Unorted
"docs": [
  { "id": "1", "title": ["One", "z-One", "a-One"] },
  { "id": "2", "title": ["Two", "z-Two", "a-Two"] },
  { "id": "3", "title": ["Three", "z-Three", "a-Three"] }
]

Надеемся, что Solr позволяет сортировать результаты по выводу функции, то есть выможет использовать любой из запросов функции Solr , чтобы «получить» одно значение для каждого поля заголовка.Ответ, на который вы ссылались, является хорошим примером, даже если он может не сработать для вас (поскольку в заголовке потребуется включить docValues ​​- зависит от определения поля - и зная, что функции max / min следует использовать только с числовыми значениями), просто чтобы получитьидея:

# here the 2nd argument is a callback to max(), used precisely to get a single value from title
sort=field(title,max) asc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...