Присоединяйтесь к наборам запросов, но оставляйте аннотированные поля с разными значениями - PullRequest
0 голосов
/ 09 апреля 2019

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

  • Поиск "Майкл Скотт"

  • Сначала мы пытаемся сопоставить «Майкл Скотт» напрямую и сохранить его в 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 или другие хаки, но есть ли способ сделать это способом, аналогичным тому, который я пробовал?

Спасибо!

1 Ответ

0 голосов
/ 09 апреля 2019

Я не думаю, что вы хотите использовать свои наборы запросов. Звучит так, как будто вы хотите союз .

full_name = full_name.annotate(relevance=Value(1, IntegerField()))
words = words.annotate(relevance=Value(2, IntegerField()))

return full_name.union(words).order_by('relevance')

Если наборы запросов относятся к разным моделям, вам нужно быть осторожным в отношении того, какие поля включены.

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