【问题标题】:Are updated data in an elastic sorted index still ordered?弹性排序索引中的更新数据是否仍然有序?
【发布时间】:2021-09-12 13:48:32
【问题描述】:

假设我有一个像这样的排序索引(弹性搜索)

GuyA;150 - 盖伊B;101 - 盖伊C;74 - 盖伊D;12

如果我插入一个新条目,可以说 GuyE;90 索引应该这样组织:

GuyA;150 - 盖伊B;101 - 盖伊;90 - 盖伊C;74 - 盖伊D;12

但如果我使用脚本(在更新后请求中)更新 GuyD 的值到 1000 索引会是:

GuyA;150 - 盖伊B;101 - 盖伊;90 - 盖伊C;74 - GuyD;1000

GuyD;1000 - 盖亚;150 - 盖伊B;101 - 盖伊;90 - GuyC;74

请我专门讨论排序索引:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-index-sorting.html 似乎在任何地方都找不到信息。

基本上:更新的管理方式是否与排序索引中的插入相同?我知道我有一个插入的优势,因为它会以排序的方式被索引,但是如果更新改变了顺序,我会保留它吗?

谢谢

ps:我的映射/设置:(我删除了不相关的部分)

  "settings": {
    "index": {
      "sort.field": "Counter", 
      "sort.order": "desc",
......,
  "mappings": {
    "dynamic": "false",
    "properties": {
      "Type": {
        "type": "keyword"
      },
      "Counter":{
        "type":"integer"
      }.....

【问题讨论】:

  • 我认为这个答案应该会有所帮助:stackoverflow.com/a/67945375/4604579(提示:索引排序并不意味着您不必在搜索时指定排序子句。如果您强制合并就可以了您的单片索引到单个段,但在任何其他情况下,您也需要在搜索时指定排序)
  • @Val Thx,我已编辑问题以考虑您的回答。我有点猜测它是这样工作的。我对问题的第一部分最感兴趣。
  • 除非我遗漏了一些明显的东西,否则我仍然认为其他线程可以回答您的问题。问题是您的查询没有排序子句,因此您的结果没有排序
  • Index sorting 主要是一个查询优化功能,即它以一种使查询更高效的方式存储数据,这并不意味着您的数据将始终以排序方式返回而无需指定它。
  • 好的,我将删除我的问题的第二部分。这可能会令人困惑。我要问的是:更新的行为与在排序索引中插入的方式相同吗

标签: elasticsearch


【解决方案1】:

更新是 GET + INSERT + DELETE,所以是的,它的行为方式相同。 ES会将旧文档在其segment中标记为已删除,新文档将在新segment中以排序方式存储。

一旦段被合并(最终),无论是仅插入一次文档还是在事后插入并更新它都没有区别,新创建的段也将按照与旧段相同的方式排序。

所以具体来说,将会发生的事情是这样的:

在旧段 A 中:

GuyA;150 - GuyB;101 - GuyE;90 - GuyC;74 - GuyD;12 
                                         [DELETED]

在新的细分 B 中(假设您还有一个新的 GuyF 和 GuyG 在 GuyD 更新之前被索引):

GuyG;2500 - GuyD;1000 - GuyF;134

新旧段都已排序,一旦合并到新段 C 中,该段将如下所示:

GuyG;2500 - GuyD;1000 - GuyA;150 - GuyF;134 - GuyB;101 - GuyE;90 - GuyC;74

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2016-01-14
    • 1970-01-01
    • 2015-12-30
    • 2017-03-11
    • 2015-09-09
    • 2019-11-11
    • 2016-03-24
    • 2019-01-26
    相关资源
    最近更新 更多