gpt4 book ai didi

elasticsearch - 一个大的Elasticsearch查找索引,还是几个小的索引?

转载 作者:行者123 更新时间:2023-12-02 22:35:25 25 4
gpt4 key购买 nike

我正在创建一个查找索引,该索引将仅用作terms filter。因此,无需搜索/汇总,只需过滤和GET即可。

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

例如,假设每个文档都与一个用户有关。每个用户都有他们玩过的游戏,看过的书和看过的电影的列表。在搜索游戏/书籍/电影推荐时,我将使用过滤器一词来过滤掉他们已经与之互动的那些物品。

我想知道是否应该有一个包含文档映射的查找索引:users_index

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

或每个查询值一个索引,例如: user_games_index
{
'game_ids': []
}
user_movies_index
{
'movie_ids': []
}
user_books_index
{
'book_ids': []
}

优点之一:
  • 每个索引都有开销,因此
  • 越少越好
  • 如果我想检索用户的所有信息,则全部放在一个索引中

  • 多个索引的优点:
  • 根据update api docs,更新文档意味着首先检索整个内容。我将大量更新每个文档,这些数组可能会变得很大(请考虑数千个id)。然后更新书本ID将检索所有游戏ID,这将占用内存。如果它们在不同的索引中,则可以避免。
  • 就我而言,更容易维护

  • 我应该注意,如果使用多个索引,则只能是4或5,每个索引大约有50万个文档。另外,每个索引只有1个主分片,没有副本,而且我在单个m5.2xlarge EC2实例(8个核,32G ram)上。

    这些统计数据是如此之小,以至于目前它真的不重要吗?还是我应该赞成一个或多个指数?

    最佳答案

    第三种选择怎么样?

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

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

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

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

    所有值的类型均为“关键字”,并且过滤应快速。

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

    编辑:我添加了查询示例,以说明如何使用 bool(boolean) 查询过滤出结果。

    例:
  • 我希望X使用者未与之互动的所有电影/游戏/书籍。

  • GET _搜索
    {
    "query": {
    "bool": {
    "must_not":{
    "term" : {
    "user_id" : "user X"
    }
    }
    }
    }
    }
  • 我只希望X用户未与之互动的电影。

  • GET _搜索
    {
    "query": {
    "bool": {
    "must_not":{
    "term" : {
    "user_id" : "user X"
    }
    },
    "filter":{
    "term" : {
    "document_type" : "movie"
    }
    }
    }
    }
    }

    关于elasticsearch - 一个大的Elasticsearch查找索引,还是几个小的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56307993/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com