2013-12-12 29 views
0

我正在编写一个将创建和管理用户记录的服务。其中有1亿多人。 对于每个新用户,服务将生成一个唯一的用户标识并将其写入数据库。数据库根据生成的唯一用户标识分片。关于Elasticsearch的查询信息

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

但是由于数据库是基于主键(唯一用户标识)分片的。我将需要搜索所有分片以查找与特定列匹配的用户记录。

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

我的问题是:

- 我可以从这里ES期待什么样的表现?假设我有100多万条用户记录,每个用户记录的5列需要编入索引。我知道它也取决于硬件配置。但请假设一个调整好的硬件。

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

基于大数据集的ElasticSearch经验的任何意见/建议非常感谢。

+1

我认为你可以使用ES来做到这一点。 100M记录是ES中的正常数字。我的数据大约有80M记录,索引8列,并且工作正常。在ES中,所有内容都被编入索引,并将加载到内存中以加快搜索速度。我建议您阅读elasticsearch.org中的文档/演示文稿,并加入社区以研究如何实施 –

+0

Hello Duc,您的所有数据都驻留在内存中吗?你会得到什么样的阅读表现?另外你使用ES的原因是什么? – snegi

+0

这取决于你的查询,你的目的。我让它在内存中缓存,因为我专注于性能,我主要用它来搜索数据 –

回答

1

ES并未明确设计为完全在内存中运行 - 通常,您不希望在Java应用程序中使用大型无界数据集(尽管您可以使用堆外存储器)执行此操作。相反,它会缓存它所能做到的,并依赖于操作系统的磁盘缓存。

即使在一台机器上,1亿多条记录也不应该成为问题。我在一台机器上运行一个索引,其中包含1500万条约100个小字段(无大文本字段)的记录,总计达65Gb的数据。相当复杂的查询返回的id/score小于500ms,需要加载文档的查询在1-1.5秒内针对单个SSD进行预热vm。我倾向于给予JVM 12-16GB的内存,而且我发现通过群集扩展比单个巨​​大的虚拟机更好。

+0

嘿布鲁斯,非常感谢您的回复。实际上500ms听起来很大。我可以控制ES如何分割我的数据。其实我试图找到一些关于ES如何保持索引的技术文档,但没有找到。理想情况下,我不希望数据驻留在内存之外,因为这需要磁盘IO,交换等。我试图将ES用作多键值memcache。 – snegi

+0

500ms很大 - 但我的查询也很庞大也很复杂。简单的查询会更快,简单的GET类型的请求非常快。如果有可用的内存,可以使用内存存储(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index - 模块 - store.html#文件系统) –