首页 > 解决方案 > 哪个 NoSQL DB 可用于多字段搜索

问题描述

假设我们有一个可以包含 50-60 个字段的文档。例如:

{  
  "priceCurrency": "USD",
  "price": "119.99",
  "priceValidUntil": "2020-11-05",
  "brand": "Acme",
  "logo": "http://www.example.com/logo.png",
  "name": "WidgetPress",
  "category": "Widgets",
  "image": "http://www.example.com/image.jpg",
  "description": "This is an excellent widget with 21 features and 4 colors."
}

现在,在这 60 个字段中,我们可以查询 20-25 个字段。所以这意味着我们需要所有这些字段的索引。

在这些字段上形成的查询可以有相等和不等运算符。查询也可以有 AND/OR/NOT 运算符。

将没有全文搜索要求。

对于这种情况,首选 ElasticSearch 还是 MongoDB?

我在一篇文章中读到,在 mongo 中支持超过 5 个索引可能会使写入变慢。所以在这种情况下,应该首选 ES。

我们的数据大约为 200 GB。RPS 将是 20,000。

编辑 Qs - 只是想知道 ScyllaDB 对这个用例有意义吗?

标签: mongodbelasticsearchdatabase-designscylla

解决方案


虽然不完全是您问题的答案,但这应该让您对如何根据功能和非功能需求选择系统有所了解。

满足您的主要要求,是的,您不需要对未进行任何搜索的数据进行索引,使用index 选项,您可以禁用特定字段的索引(注意默认为 true)。这将减少您的倒排索引大小并提高性能。

第二部分是使用过滤上下文,因为你没有全文搜索的要求,而 Elasticsearch 将数据缓存在过滤上下文中,这使得它非常快,无需引入像 Redis 等外部缓存系统。

有关过滤器缓存的更多信息,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#filter-context 官方文档,并引用同一文档:

Elasticsearch 会自动缓存常用的过滤器,以提高性能。

还,

在过滤器上下文中,查询子句回答“此文档是否匹配此查询子句?”的问题。答案很简单,是或否——不计算分数。过滤上下文主要用于过滤结构化数据,例如

这个时间戳是否在 2015 年到 2016 年的范围内?状态字段是否设置为“已发布”

这似乎是您的确切要求。


推荐阅读