Проблема, которую я пытаюсь решить, состоит в том, чтобы выполнить поиск, который включает в себя несколько шагов релевантности, основанных на начальном запросе, например ::
Поиск "Майкл Скотт"
Сначала мы пытаемся сопоставить «Майкл Скотт» напрямую и сохранить его в full_name
- Это, вероятно, вернет наиболее релевантные объекты
Далее будет выполнено несколько запросов для поиска каждого слова в отдельности, например «Майкл» и «Скотт», и для него будет установлено значение words
- Это вернет много результатов, большинство из которых - шум, если это очень распространенное имя
В конце концов, наборы запросов объединяются с использованием full_name | words
, но это приводит к смешиванию результатов из-за упорядочения модели, в то время как я хотел сохранить все в full_name
до того, что в words
.
Чтобы попытаться это исправить, я аннотировал оба набора запросов новым значением и попытался упорядочить его после:
full_name = full_name.annotate(relevance=Value(1, IntegerField()))
words = words.annotate(relevance=Value(2, IntegerField()))
return (full_name | words).order_by('relevance')
Что происходит, так это то, что все в words
изменяется на relevance=1
вместо того, чтобы сохранять значение 2
, которое я установил ранее, что делает мою попытку заказа бесполезной ...
Я знаю, что есть и другие способы добиться нужного мне порядка, например, преобразование наборов запросов в list
или другие хаки, но есть ли способ сделать это способом, аналогичным тому, который я пробовал?
Спасибо!