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

标签 elasticsearch indexing information-retrieval

我正在创建一个查找索引,该索引将仅用作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/

    相关文章:

    elasticsearch - Airflow - 如何将任务日志发送到 Elasticsearch ?

    开放简历 |筛选冲浪 |散列 |图片搜索

    python - 倒排索引,我可以在其中保存单词的元组及其来源的 id

    elasticsearch - 如何在 ElasticSearch 中基于正则表达式过滤标记

    c# - 如何在FluentD中使用Forward插件将输入读取为json并转发相同内容?

    ruby-on-rails - 使用 Homebrew 软件安装了 elasticsearch,但找不到配置文件

    MySQL/MariaDB InnoDB 索引停止工作

    mysql - 在 group by 子句中使用的列上添加索引好吗?

    SQL Server 分区 - 唯一索引错误

    java - 为什么 Lucene 不支持对现有文档进行任何类型的更新