基于弹性搜索时间的Feed模块的最佳应用程序?

时间:2017-07-12 15:55:00

标签: performance elasticsearch timeline feeds

我是弹性搜索的新手,并寻找最佳解决方案,我可以创建一个Feed模块,该模块具有基于时间的Feed以及组和评论。

我学到的东西很少,想出来了。



PUT /group
    {
      "mappings": {
        "groupDetail": {},
        "content": {
          "_parent": {
            "type": "groupDetail" 
          }
        },
        "comment": {
          "_parent": {
            "type": "content" 
          }
        }
      }
    }




因此将根据索引单独放置。

但是在我发现一个帖子后,我发现父母的搜索操作比嵌套对象贵。

类似下面的内容是两个组(feed),其中包含内容和注释的详细信息作为嵌套元素。



{
  "_index": "group",
  "_type": "groupDetail",
  "_id": 6829,
  "_score": 1,
  "_source": {
    "groupid": 6829,
    "name": "Jignesh Public",
    "insdate": "2016-10-01T04:09:33.916Z",
    "upddate": "2017-04-19T05:19:40.281Z",
    "isVerified": true,
    "tags": [
      "spotrs",
      "surat"
    ],
    "content": [
      {
        "contentid": 1,
        "type": "1",
        "byUser": 5858,
        "insdate": "2016-10-01 11:20",
        "info": [
          {
            "t": 1,
            "v": "lorem ipsum long text 1"
          },
          {
            "t": 2,
            "v": "http://www.imageurl.com/1"
          }
        ],
        "comments": [
          {
            "byuser": 5859,
            "comment": "Comment 1",
            "upddate": "2016-10-01T04:09:33.916Z"
          },
          {
            "byuser": 5860,
            "comment": "Comment 2",
            "upddate": "2016-10-01T04:09:33.916Z"
          }
        ]
      },
      {
        "contentid": 2,
        "type": "2",
        "byUser": 5859,
        "insdate": "2016-10-01 11:20",
        "info": [
          {
            "t": 4,
            "v": "http://www.videoURL.com/1"
          }
        ],
        "comments": [
          {
            "byuser": 5859,
            "comment": "Comment 1",
            "upddate": "2016-10-01T04:09:33.916Z"
          },
          {
            "byuser": 5860,
            "comment": "Comment 2",
            "upddate": "2016-10-01T04:09:33.916Z"
          }
        ]
      }
    ]
  }
}

{
  "_index": "group",
  "_type": "groupDetail",
  "_id": 6849,
  "_score": 1,
  "_source": {
    "groupid": 6849,
    "name": "Xyz Group Public",
    "insdate": "2016-10-01T04:09:33.916Z",
    "upddate": "2017-04-19T05:19:40.281Z",
    "isVerified": false,
    "tags": [
      "spotrs",
      "food"
    ],
    "content": [
      {
        "contentid": 3,
        "type": "1",
        "byUser": 5858,
        "insdate": "2016-10-01 11:20",
        "info": [
          {
            "t": 1,
            "v": "lorem ipsum long text 3"
          },
          {
            "t": 2,
            "v": "http://www.imageurl.com/1"
          }
        ],
        "comments": [
          {
            "byuser": 5859,
            "comment": "Comment 1",
            "upddate": "2016-10-01T04:09:33.916Z"
          },
          {
            "byuser": 5860,
            "comment": "Comment 2",
            "upddate": "2016-10-01T04:09:33.916Z"
          }
        ]
      },
      {
        "contentid": 4,
        "type": "2",
        "byUser": 5859,
        "insdate": "2016-10-01 11:20",
        "info": [
          {
            "t": 4,
            "v": "http://www.videoURL.com/1"
          }
        ],
        "comments": [
          {
            "byuser": 5859,
            "comment": "Comment 1",
            "upddate": "2016-10-01T04:09:33.916Z"
          },
          {
            "byuser": 5860,
            "comment": "Comment 2",
            "upddate": "2016-10-01T04:09:33.916Z"
          }
        ]
      }
    ]
  }
}




现在,如果我试着用嵌套对象思考,那么如果用户非常频繁地添加评论比重新索引因素会影响我会感到困惑吗?

所以主要想想我想问的是哪种方法可以经常添加评论,我的内容搜索结果也更快。

2 个答案:

答案 0 :(得分:3)

性能

  • 父/子将相关数据存储在相同的分片中,作为单独的doc,避免使用网络;
  • 父母/子女在检索数据时需要加入过程;
  • 嵌套对象将内部和外部对象存储在一起,作为单个doc;

所以,我们可以推断:

  • 更新嵌套对象将重新索引整个索引,如果您的文档很大,这可能非常昂贵;
  • 单独更新父母或子女不会影响另一方;
  • 搜索嵌套对象有点快,这样可以节省加入过程;

建议

据我了解您的问题,您应该使用父/子。

  • 当您的论坛评论越来越多时,添加新评论仍会重新编制整个内容的索引,这可能非常耗时;
  • 另一方面,在找到孩子之后,与父母/孩子一起搜索评论只需再查一次,这是相对可接受的。

此外,您还应该考虑在评论中添加评论的比率:

  • 如果您需要搜索很多但有一些新评论,也许您可​​以选择嵌套对象;
  • 否则,选择父/子;

顺便说一下,你可以把它们结合起来:

  • 当此Feed处于活动状态时,请使用父/子来存储它们;
  • 当它关闭时,即不再添加注释时,将它们移动到具有嵌套对象的新索引;

答案 1 :(得分:2)

如果您没有指定除very frequently以外的更详细信息,则很难提出建议。您还没有提到数据的样子。即使在激烈的讨论中,博客文章中的评论也可能很少发生。论坛帖子中的评论/回复(这将导致一个巨大的文件)可能会非常不同。我个人从嵌套开始,看看它是怎么回事,但我也不知道所有的要求,所以这可能是一个非常错误的答案。