mongodb - 哪个 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 对这个用例有意义吗?
解决方案
虽然不完全是您问题的答案,但这应该让您对如何根据功能和非功能需求选择系统有所了解。
满足您的主要要求,是的,您不需要对未进行任何搜索的数据进行索引,使用index 选项,您可以禁用特定字段的索引(注意默认为 true)。这将减少您的倒排索引大小并提高性能。
第二部分是使用过滤上下文,因为你没有全文搜索的要求,而 Elasticsearch 将数据缓存在过滤上下文中,这使得它非常快,无需引入像 Redis 等外部缓存系统。
有关过滤器缓存的更多信息,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#filter-context 官方文档,并引用同一文档:
Elasticsearch 会自动缓存常用的过滤器,以提高性能。
还,
在过滤器上下文中,查询子句回答“此文档是否匹配此查询子句?”的问题。答案很简单,是或否——不计算分数。过滤上下文主要用于过滤结构化数据,例如
这个时间戳是否在 2015 年到 2016 年的范围内?状态字段是否设置为“已发布”
这似乎是您的确切要求。
推荐阅读
- powershell - Spring Boot Actuator 2.0.0 ShutDown 端点在使用 POST 请求调用时返回错误 415
- java - java - 如何在没有系统属性的Java URL连接中设置http.nonProxyHosts?
- python - 如何获取字典键和值
- gradle - gradle 的新插件 dsl 语法
- google-chrome - 如何使用代码或 API 从 chrome 开发人员工具中自动获取 fps 仪表值?
- qt - fileDialogDCM.fileUrls.count 给出“未定义”(QML)
- math - What's the time complexity name for O(n*m) (ex: linear, constant)?
- html - 可滚动容器上的引导下拉定位
- regex - JMeter正则表达式提取器不在单引号内提取
- typescript - 如何为第三个库添加打字文件?