elasticsearch,scalability,Database,elasticsearch,Scalability" /> elasticsearch,scalability,Database,elasticsearch,Scalability" />

Database 关于Elasticsearch的查询

Database 关于Elasticsearch的查询,database,elasticsearch,scalability,Database,elasticsearch,Scalability,我正在编写一个服务,将创建和管理用户记录。一亿多。 对于每个新用户,服务将生成一个唯一的用户id并将其写入数据库。数据库根据生成的唯一用户id进行分片 每个用户记录都有几个字段。现在,其中一个要求是服务能够搜索是否存在具有匹配字段值的用户。所以这些字段在数据库模式中声明为索引 然而,由于数据库是基于主键(唯一用户id)分片的。我需要搜索所有碎片,以找到与特定列匹配的用户记录 所以要快速查找。我想做的一件事是建立一个ElasticSearch集群。服务将在每次创建新用户记录时写入ES群集。ES c

我正在编写一个服务,将创建和管理用户记录。一亿多。 对于每个新用户,服务将生成一个唯一的用户id并将其写入数据库。数据库根据生成的唯一用户id进行分片

每个用户记录都有几个字段。现在,其中一个要求是服务能够搜索是否存在具有匹配字段值的用户。所以这些字段在数据库模式中声明为索引

然而,由于数据库是基于主键(唯一用户id)分片的。我需要搜索所有碎片,以找到与特定列匹配的用户记录

所以要快速查找。我想做的一件事是建立一个ElasticSearch集群。服务将在每次创建新用户记录时写入ES群集。ES cluster将根据相关字段索引用户记录

我的问题是:

--在这里,我可以期望ES有什么样的表现?假设我有1亿多条用户记录,其中每个用户记录的5列需要索引。我知道这也取决于硬件配置。但请假设一个经过良好调整的硬件

--在这里,我尝试使用ES作为memcache的替代方案,提供多个键。所以我希望所有数据集都在内存中,不需要持久。ES是这样做的正确工具吗


非常感谢基于ElasticSearch对大型数据集的经验提出的任何评论/建议。

ES并不是明确设计为完全在内存中运行的-您通常不希望在Java应用程序中使用大型无界数据集(尽管您可以使用堆外内存)。相反,它将缓存它能缓存的内容,其余部分将依赖操作系统的磁盘缓存


即使在一台机器上,1亿多条记录也不应该成为问题。我在一台机器上运行了一个索引,该索引包含1500万条记录,约100个小字段(没有大的文本字段),相当于磁盘上65Gb的数据。只返回id/score的相当复杂的查询在不到500毫秒的时间内执行,而需要加载文档的查询在1-1.5秒内在一个预热的虚拟机上针对单个SSD返回。我倾向于为JVM提供12-16GB的内存—更多,我发现通过集群进行扩展比通过单个大型虚拟机更好。

我认为可以使用ES来实现这一点。100米记录是ES中的正常数字。我的数据大约有8000万条记录,有8列索引,工作正常。在ES中,所有内容都被编入索引,并将加载到内存中以加快搜索速度。我建议您阅读elasticsearch.org中的文档/演示文稿,并加入社区,进一步研究如何实现Hello Duc,您的所有数据是否都驻留在内存中?你有什么样的阅读表现?您使用ES的原因是什么?这取决于您的查询和目的。我让它缓存在内存中,因为我关注性能,我主要使用它来搜索数据嘿,布鲁斯,非常感谢你的回复。500毫秒听起来确实很有价值。我可以控制ES如何分割我的数据吗。事实上,我试图找到一些关于ES如何保存索引的技术文档,但找不到。理想情况下,我不希望数据驻留在内存之外,因为这将需要磁盘IO、交换等。我尝试使用ES作为多键值memcache。500ms很大,但我的查询也很大且复杂。更简单的查询会更快,普通的GET-type请求会非常快。如果您有可用内存,ES可以使用内存存储()