2015-11-03 57 views
0

我有一个包含apache日志数据的elasticsearch索引。这是我想要做的:在Elasticsearch中创建我的数据子集的最佳方式是什么?

  1. 确定访问某个文件(例如/signup.php)的所有访问者(通过ip号码)。
  2. 请在我的数据的搜索/查询/汇聚,但限制进行考察,以包含IP号的第1步中

发现在SQL世界的文件,我只是想创建一个临时表并从第一步插入所有匹配的IP号码。接下来,我会查询我的主表并通过加入我的临时表中的IP号码来限制结果集。

我明白在elasticsearch中连接是不可能的。该elasticsearch documentation提出一些方法来处理这样的情况:

  1. 应用方面加入

这似乎并不现实,因为IP号码列表可能会非常大,它似乎效率不高送结果传递给客户端,然后在一个巨大的条件过滤器中将其传回给elasticsearch。

  • 非规范化的数据
  • 这将涉及遍历匹配的IP号码和在用于与类似“in_group”任何给定的IP号码的索引更新的每个文档:真的,所以我可以在以后的查询中使用它。这似乎也是非常不切实际和低效的,特别是因为源查询(步骤1)是动态的。

  • 嵌套的对象和/或父 - 子关系
  • 我不知道如果与嵌套对象动态创建新文档是在这种情况下实际的。在我看来,我最终会复制大量的数据。

    我是elasticsearch和noSQL的新手,所以也许我只是以错误的方式来看问题,我不应该试图首先模拟一个JOIN。

    但是这似乎是分割数据集的一种常见情况,这让我想知道我是否忽略了其他一些明显的做法?

    任何帮助,将不胜感激!

    +0

    我不认为它应该成为答案,但是,是的,只要我能理解你的问题,你就必须使用应用端连接。对Elastic来说不应该太重(尤其是如果你使用过滤器,而不是查询来获取IP) –

    回答

    0

    如果我正确理解你的问题,你正试图根据一定的条件得到你的文档的一个子集,并使用该子集进一步查询/搜索/聚合它。

    如果为true,您为什么要将它存储在另一个视图(sql类型)中。 elasticsearch的主要功能是它的过滤器缓存功能,因此它大大减少了查询时间。使用此功能,您需要执行的所有查询/搜索/聚合需要一个术语过滤器,用于指定您在步骤1中要执行的条件。现在,无论您想要执行的其他操作如何,您都可以执行此操作在已经收缩的数据集中的相同查询中。

    如果您有其他不同的使用情况,则可以考虑更改文档(映射)的存储以便于更快速地检索。

    +0

    是的,你理解正确。如果我使用条件过滤器并传入一长串数字,我可以在一个查询中完成所有操作。但是,如何在不拉动线路上的所有数据的情况下制作IP数组?从@ evaldas-buinauskas的评论和他的链接问题看来,elasticsearch正在研究它,但是如果您有任何建议,那将会很棒 – Michael

    +0

    我已经得到了您的确切要求,而evaldas实际上提到的是合乎逻辑的。我的回答是基于这样的假设,即如果IP和所访问的文件在单个文档中可用,并且所有其他操作也需要在同一组文档中发生,则词条过滤器可以帮助您至少进行一些查询。 – piyushGoyal

    相关问题