elasticsearch elasticsearch:决定首先运行哪个查询,elasticsearch,elasticsearch" /> elasticsearch elasticsearch:决定首先运行哪个查询,elasticsearch,elasticsearch" />

elasticsearch elasticsearch:决定首先运行哪个查询

elasticsearch elasticsearch:决定首先运行哪个查询,elasticsearch,elasticsearch,我们有一个简单的网页,用户可以在其中提供一些输入并查询数据库。我们目前使用mongodb,但希望迁移到elasticsearch,因为查询速度更快 有一些必需的搜索字段,如开始和结束日期,还有一些可选字段,如匹配条目的搜索字符串,或匹配父条目的父搜索字符串。父子关系仅通过包含每个条目的祖先ID的字段来描述 问题如下:如果同时提供了搜索和父搜索字符串,是否有办法在执行查询之前知道应该首先执行哪个查询,以便更快地提供结果并提高性能 例如,一个特定的父搜索结果可能只包含2个文档/父条目,然后我们可以获

我们有一个简单的网页,用户可以在其中提供一些输入并查询数据库。我们目前使用mongodb,但希望迁移到elasticsearch,因为查询速度更快

有一些必需的搜索字段,如开始和结束日期,还有一些可选字段,如匹配条目的搜索字符串,或匹配父条目的父搜索字符串。父子关系仅通过包含每个条目的祖先ID的字段来描述

问题如下:如果同时提供了搜索和父搜索字符串,是否有办法在执行查询之前知道应该首先执行哪个查询,以便更快地提供结果并提高性能

例如,一个特定的父搜索结果可能只包含2个文档/父条目,然后我们可以获取与搜索字符串匹配的所有子项。在这种情况下,我们应该首先执行父查询,然后执行条目查询

一个选项是获取两个查询的计数,然后首先执行计数最小的查询,但是这个解决方案不是更糟糕吗,因为查询将执行两次?一次用于计数,一次用于实际查询

还有其他的解决办法吗

另外,我们使用elasticsearch v1.7

示例

假设用户希望搜索与以下字段匹配的所有条目

搜索字符串:
类型:块和名称:test

parentSearchString:
名称:parentTest而非类型:BLOCK

这意味着我们要么

  • 获取与
    parentSearchString
    匹配的所有条目(父项)并存储它们的ID。然后,我们必须获取与
    searchString
    匹配的所有条目,并且必须在
    祖先
    字段中包含任何父ID
  • 获取与
    搜索字符串匹配的所有条目
    ,并存储所有
    祖先
    ID。然后获取与
    parentSearchString
    匹配的所有条目,它们的id是
    祖先的id之一
  • 只是澄清一下,父项和子项都具有完全相同的结构,并且位于相同的索引中。我们不能有不同的索引,因为pare-child关系可以嵌套10次,因此条目可以同时是父项和子项。条目看起来或多或少类似于:

    {
      id: "e32452365321",
      name: "name",
      type: "type",
      ancestors: "id1 id2 id3" // stored in node as an array of ids
    }
    

    首先,我建议你,如果可能的话,升级你的Elasticsearch版本。自1.7以来发生了很多事情,老实说,我不知道下面文章中所写的内容是否适用于这样一个旧版本(可能不是)

    但对于您的实际问题:希望我理解正确,但您试图估计Elasticsearch查询的成本是多少?嗯,你不必这么做。如果在一个嵌套查询中提供所有“查询”,Elasticsearch将为您提供:

    关于速度,我还可以提到另一件事:计算分数确实需要时间。因此,如果排序不是基于elasticsearch _分数,则需要使用布尔过滤器查询。这也适用,如果您只想按父匹配的_分数排序,那么您可以将子查询放入过滤器中


    更新

    多亏了你的例子,我现在明白了问题所在。不幸的是,自我参照的亲子关系是通过ElasticSearch实现的,所以您的方法可能是正确的。您可能想查看文档中关于的简短章节

    因此,一般来说,您希望发送第二个查询时使用尽可能少的ID/术语。虽然获取这两个查询的计数并不像您想象的那么糟糕,因为结果很可能仍然是缓存的,但它真的有帮助吗?因为如果要从一个子代转到另一父代,则必须计算祖先(字段值),而不是实际的文档计数

    我认为,最昂贵的操作通常是从磁盘获取结果源。因此,无论您选择哪种方式,您都可能只需要在第一个查询中获取所需的内容。因此,您的选择是:

    • 仅获取父匹配项的id,然后在第二个查询中使用on
      祖先
    • 或者,仅获取子匹配项的祖先字段,并在第二个查询中使用

    不幸的是,我帮不了你们更多,因为我并没有足够的经验来比较这些方法的速度。我的猜测是,id过滤器通常会更快。但这只是一个猜测…

    首先,我建议您,如果可能的话,升级您的Elasticsearch版本。自1.7以来发生了很多事情,老实说,我不知道下面文章中所写的内容是否适用于这样一个旧版本(可能不是)

    但对于您的实际问题:希望我理解正确,但您试图估计Elasticsearch查询的成本是多少?嗯,你不必这么做。如果在一个嵌套查询中提供所有“查询”,Elasticsearch将为您提供:

    关于速度,我还可以提到另一件事:计算分数确实需要时间。因此,如果排序不是基于elasticsearch _分数,则需要使用布尔过滤器查询。这也适用,如果您只想按父匹配的_分数排序,那么您可以将子查询放入过滤器中


    更新

    多亏了你的例子,我现在明白了问题所在。不幸的是,自我参照的亲子关系是通过ElasticSearch实现的,所以您的方法可能是正确的。您可能想查看文档中关于的简短章节

    因此,一般来说,您希望发送第二个查询时使用尽可能少的ID/术语。虽然获取这两个查询的计数并不像您想象的那么糟糕,因为结果很可能仍然是缓存的,但它真的有帮助吗?因为如果你是从芝加哥来的