【问题标题】:Sorting ElasticSearch query by multiple fields按多个字段对 ElasticSearch 查询进行排序
【发布时间】:2020-10-22 03:02:13
【问题描述】:

我有一些数据正在尝试按非常特定的顺序排序。

我在这里查看了一些关于 SO 的问题,Elasticsearch sort on multiple queries 非常有帮助。据我所知,我正在以正确的顺序取回数据,但它并不总是相同的数据,而且对于查询返回的内容似乎非常随机。

我的问题是,如何让我的数据正确排序并每次都得到预期的数据?

示例数据

[
    {
        id: 00,
        ...
        current_outage: {
            device_id: 00,
            ....
        },
        forecasted_outages: [
            {
                device_id: 00
            }
        ]
    },
    {
        id: 01,
        ...
        current_outage: {
            device_id: 01,
            ....
        },
        forecasted_outages: []
    },
    {
        id: 02,
        ...
        current_outage: null,
        forecasted_outages: [
            {
                device_id: 02
            }
        ]
    },
    {
        id: 03,
        ...
        current_outage: null,
        forecasted_outages: []
    },
]

当前查询

bool: {
    should: [
        {
            constant_score: {
                boost: 6,
                filter: {
                    nested: {
                        path: 'current_outage',
                        query: {
                            exists: {
                                field: 'current_outage'
                            }
                        }
                    }
                }
            }
        },
        {
            nested: {
                path: 'forecasted_outages',
                query: {
                    exists: {
                        field: 'forecasted_outages'
                    }
                }
            }
        }
    ]
}

重申一下,上面的查询以我期望的格式/排序方法返回数据,但它不会每次都返回我期望的数据。据我所知,返回的数据非常随机。

排序标准

  • 第一个:同时包含current_outage 和一个或多个forecasted_outages 的数据
  • 第二个:只有current_outage的数据
  • 第三:只有forecasted_outages的数据

编辑

根据用户的不同,返回的数据可以是零到数千个结果。用户可以选择对数据进行分页或返回所有相关数据。

编辑 2

返回的数据将是从 0 到 1,000 次点击。

【问题讨论】:

  • 总点击数是多少?
  • 我正要将此添加到问题中,但总点击量可能是零到数千个结果。数据通常会被分页,我已经考虑过但没有包括在示例中,但也可以选择返回所有用户数据。

标签: elasticsearch


【解决方案1】:

如果搜索命中数超过 10(默认结果大小)并且所有文档具有相同的分数(在您的情况下,它可能是因为您提供了恒定分数),那么每次运行返回的数据可能不同(给出随机性感觉)。

这样做的原因是,搜索结果从不同的分片合并,直到命中数达到 10,其余结果被忽略。因此,每次运行都可以根据合并的分片产生不同的结果。

增加结果大小以包含所有搜索结果可以为每次运行提供相同的数据。

更新

将分片计数更改为 1 可能会有所帮助(如果索引已创建,则您已关闭并重新打开索引)。

PUT /twitter/_settings
{
    "index" : {
        "number_of_shards" : 1
    }
}

【讨论】:

  • 如果我们现在使用更小的东西会怎样。假设用户最多只能获得 30 次按 10 次为一组进行分页的点击,因此需要三个单独的调用才能对所有数据进行分页。如何确保第 1 页始终返回相同的数据(第 2 页和第 3 页也是如此)
  • 更新了我的答案,将分片数改为1。由于这里的结果集只有1000左右,所以应该没有任何性能问题。
猜你喜欢
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
相关资源
最近更新 更多