【问题标题】:One large Elasticsearch lookup index, or several smaller ones?一个大的 Elasticsearch 查找索引,还是几个较小的?
【发布时间】:2019-10-11 23:06:12
【问题描述】:

我正在创建一个仅用作terms filter 的查找索引。所以没有搜索/聚合,只有过滤和GETs。

我正在讨论这个查找索引的结构,每个文档是否应该包含我想要过滤的所有字段,或者我是否应该为每个字段创建一个索引。

例如,假设每个文档都属于一个用户。每个用户都有一个他们玩过的游戏、读过的书和看过的电影的列表。在搜索游戏/书籍/电影推荐时,我将使用术语过滤器来过滤掉他们已经互动过的那些项目。

我想知道我是否应该有一个带有文档映射的单个查找索引,例如: users_index

{
  'game_ids': [],
  'movie_ids' : [],
  'book_ids': []
}

或一个索引 per 查找值,例如: user_games_index

{
  'game_ids': []
}

user_movies_index

{
  'movie_ids': []
}

user_books_index

{
  'book_ids': []
}

一个索引的优点:

  1. 每个索引都有开销,所以越少越好
  2. 如果我想检索所有用户的信息,都在一个索引中

多个索引的优点:

  1. 根据update api docs,更新文档意味着首先检索整个内容。我将大量更新每个文档,这些数组可能会变得相当大(想想数千个 id)。更新书籍 ID 将检索所有游戏 ID,这会占用内存。如果它们在单独的索引中,我可以避免这种情况。

  2. 更容易维护我的东西

我应该注意,如果我使用多个索引,它只会是 4 或 5,每个索引大约有 500k 个文档。此外,每个索引只有 1 个主分片,没有副本,而且我在单个 m5.2xlarge EC2 实例(8 核,32G 内存)上。

这些统计数据是否太小以至于在这一点上并不重要,还是我应该支持一个或多个索引?

【问题讨论】:

    标签: elasticsearch indexing information-retrieval


    【解决方案1】:

    第三个选项怎么样?

    您有一个索引,索引中的每个文档看起来像这样:

    {
        "user_id" : "some_user",
        "document_type" : "movie" or "game" or "book"
        "document_id" : "id of movie, game or book"
    }
    

    为什么?由于您说用户的游戏、电影或书籍会经常更新,因此这种方法可以让您轻松地为用户添加/删除单个电影、游戏或书籍。

    您还可以轻松过滤特定用户的书籍/电影/游戏。

    所有值都是“关键字”类型,过滤应该很快。

    PS:ES 索引的“良好”映射将尽量减少单个文档的更新次数,而是在插入/删除文档的级别上工作,因为与查找和更新文档相比,ES 可以很好地完成这项任务。

    编辑:我添加了查询示例来说明如何使用 bool 查询过滤掉结果。

    例子:

    1. 我想要用户 X 未与之互动的所有电影/游戏/书籍。

    GET _搜索

    {
      "query": {
        "bool": {
          "must_not":{
            "term" : {
                "user_id" : "user X"
            }
          }
        }
      }
    }
    
    1. 我只想要用户 X 没有互动过的电影。

    GET _搜索

    {
      "query": {
        "bool": {
          "must_not":{
            "term" : {
                "user_id" : "user X"
            }
          },
          "filter":{
            "term" : {
                "document_type" : "movie"
            } 
          }
        }
      }
    }
    

    【讨论】:

    • 这是一个非常好的主意,但是如何在单个查询中过滤掉用户的所有电影/书籍/游戏?
    • 布尔查询可以实现。更多信息在这里:elastic.co/guide/en/elasticsearch/reference/current/…
    • 我更新了过滤掉用户交互的示例查询
    • 啊,我明白你在说什么。这样做的问题是用户信息索引与保存所有项目推荐的索引不同。所以我需要做一个术语查找过滤器(如here所示)
    猜你喜欢
    • 2011-04-24
    • 2012-08-31
    • 2023-03-07
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2022-06-17
    相关资源
    最近更新 更多