Elasticsearch DSL-запрос с указанием c вывода - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть несколько объектов в базе данных: объект 1, объект 2, объект 3, .., объект n

Теперь я делаю фильтр следующим образом

MyDocument.search().filter("match", is_active=True).sort('id').execute()

Вывод:

searchDocumentobject 1, searchDocumentobject 2,searchDocumentobject 3, ....

Теперь мне нужно searchDocumentobject 2 в последнем списке.

Нужен следующий вывод:

searchDocumentobject 1,searchDocumentobject 3, .... , searchDocumentobject 2

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

В MyModel добавьте новый метод, который возвращает 0, если вы хотите сохранить этот документ, в противном случае он вернет 1.

class MyModel(models.Model):

    # Add new method here
    def get_rank(self):
        if self.id == 2:  # your condition here
            return 0      # return 0, if you want to keep it at last
        return 1

Теперь вы можете использовать этот метод в MyDocument. Добавьте новое поле в MyDocument, которое мы будем использовать для сортировки.

class MyDocument(Document):
    # Add new field here
    rank = fields.IntegerField(attr='get_rank')

Теперь вы можете запросить вот так:

MyDocument.search().filter("match", is_active=True).sort('-rank', 'id').execute()
2 голосов
/ 07 апреля 2020

Вы можете добиться такого поведения в своем поисковом запросе, используя оценку функции, идея состоит в том, что каждый другой документ будет иметь оценку 1 (по умолчанию), а с документом 2 вы даете ему более низкую оценку, а затем сортируете по "_score", " Я бы". Вот DSL, попробуйте сконструировать запрос из вашего python API:

{
  "_source": ["id"], 
  "query": {
    "function_score": {
      "query": {
        "bool": {
           //add your query here
           "must": [
             {
               "terms": {
                 "id": [1, 2, 3, 70]
               }
             }
           ]
         }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "id": 2
            }
          },
          "weight": 0.5
        }
      ]
    }
  }, 

  "sort": [
    "_score",
    {
      "id": {
        "order": "asc"
      }
    }
  ]
}

Также, как сказал Ифэн в разделе комментариев, вы можете пересортировать результаты после запроса из ES.

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