elasticsearch elasticsearch:决定首先运行哪个查询
我们有一个简单的网页,用户可以在其中提供一些输入并查询数据库。我们目前使用mongodb,但希望迁移到elasticsearch,因为查询速度更快 有一些必需的搜索字段,如开始和结束日期,还有一些可选字段,如匹配条目的搜索字符串,或匹配父条目的父搜索字符串。父子关系仅通过包含每个条目的祖先ID的字段来描述 问题如下:如果同时提供了搜索和父搜索字符串,是否有办法在执行查询之前知道应该首先执行哪个查询,以便更快地提供结果并提高性能 例如,一个特定的父搜索结果可能只包含2个文档/父条目,然后我们可以获取与搜索字符串匹配的所有子项。在这种情况下,我们应该首先执行父查询,然后执行条目查询 一个选项是获取两个查询的计数,然后首先执行计数最小的查询,但是这个解决方案不是更糟糕吗,因为查询将执行两次?一次用于计数,一次用于实际查询 还有其他的解决办法吗 另外,我们使用elasticsearch v1.7 示例 假设用户希望搜索与以下字段匹配的所有条目 搜索字符串:
elasticsearch elasticsearch:决定首先运行哪个查询,
elasticsearch,
elasticsearch,我们有一个简单的网页,用户可以在其中提供一些输入并查询数据库。我们目前使用mongodb,但希望迁移到elasticsearch,因为查询速度更快 有一些必需的搜索字段,如开始和结束日期,还有一些可选字段,如匹配条目的搜索字符串,或匹配父条目的父搜索字符串。父子关系仅通过包含每个条目的祖先ID的字段来描述 问题如下:如果同时提供了搜索和父搜索字符串,是否有办法在执行查询之前知道应该首先执行哪个查询,以便更快地提供结果并提高性能 例如,一个特定的父搜索结果可能只包含2个文档/父条目,然后我们可以获
类型:块和名称:test
parentSearchString:名称:parentTest而非类型:BLOCK
这意味着我们要么
parentSearchString
匹配的所有条目(父项)并存储它们的ID。然后,我们必须获取与searchString
匹配的所有条目,并且必须在祖先
字段中包含任何父ID搜索字符串匹配的所有条目
,并存储所有祖先
ID。然后获取与parentSearchString
匹配的所有条目,它们的id是祖先的id之一
{
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/术语。虽然获取这两个查询的计数并不像您想象的那么糟糕,因为结果很可能仍然是缓存的,但它真的有帮助吗?因为如果你是从芝加哥来的