具有特定输出的 Elasticsearch DSL 查询
Elasticsearch DSL query with specific Output
我在数据库中有几个对象:
对象 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
谢谢
您可以在您的搜索请求中使用函数得分实现此行为,想法是每个其他文档的得分为 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查询后可以重新排序
在 MyModel 中,添加一个新方法,如果您想最后保留该文档,则 returns 0,否则它将 return 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()
我在数据库中有几个对象: 对象 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
谢谢
您可以在您的搜索请求中使用函数得分实现此行为,想法是每个其他文档的得分为 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查询后可以重新排序
在 MyModel 中,添加一个新方法,如果您想最后保留该文档,则 returns 0,否则它将 return 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()