【问题标题】:Elasticsearch DSL query with specific Output具有特定输出的 Elasticsearch DSL 查询
【发布时间】:2020-04-08 14:57:24
【问题描述】:

我在数据库中有一些对象: 对象 1, 对象 2, 对象 3, .., 对象 n

现在我正在做这样的过滤器

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

输出:

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

现在我需要在列表的最后一个搜索Documentobject 2

需要这样的输出:

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

谢谢

【问题讨论】:

  • 如果有100个文档,你只返回10个文档,那么文档2会变成第10个还是第100个文档?
  • 感谢@TuyenLuong 的回复。实际上我需要所有文档,所以如果我有 100 个文档,那么我需要文档 2 在最后一个元素上。
  • 从 ES 获取后,如何根据需要对结果进行排序?

标签: python django elasticsearch search-engine


【解决方案1】:

在 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】:

    您可以使用函数 score 在搜索请求中实现此行为,其想法是每个其他文档的得分为 1(默认),而文档 2 的得分较低,然后按“_score”排序,“ ID”。这是 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 查询后重新排序结果。

    【讨论】:

    • weight 影响所有查询,而不仅仅是这个。因此,如果您定期搜索字段,ID 为 2 的文档将以较低的排名开始。不过,这可能是想要的效果。
    • 谢谢@Risadinha 我听不懂你,你能举例解释一下吗?如何设置较低的排名?
    • 在常规搜索中,例如在字段中搜索“红鞋”。假设 id 为 2 的文档包含精确的“red shoes”作为短语,而 id 为 1 的文档包含文本“blue shoes ... ... red something”。 ID 1 的得分应该低于 id 2,但是,0.5 的权重会降低 id 2 的得分 - 即使它与给定的搜索输入更相关,它也可能最终低于其他文档。
    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多