如何在elasticsearch中存储国家/州/城市信息
i.e there are many countries
each country has many states
each state has many cities
它更容易存储在关系数据库中,但如果我想存储所有可能的组合,我应该如何在elasticsearch中做到这一点
我想在包含用户信息的索引中存储国家、州、城市位置
i.e users (first_name, last_name, country, state, city ...)
2条答案
按热度按时间qpgpyjmq1#
请不要混淆elasticsearch和rdbms,因为您没有提到什么是您的用例,即它的全文搜索或聚合,我将向您展示如何使用您的数据实现全文搜索,它很容易实现,并且不需要太多配置/复杂性来实现。
由于一个用户一次只能停留在一个城市、州和国家,但如果您想为用户存储多个选项,也可以这样做,您只需索引
,
分隔的值。如果您需要这些字段的聚合,请将这些字段索引为
keyword
这样你就可以对它进行聚合了。全文搜索的完整示例
索引Map
索引示例文档
现在搜索
California
将返回第一个和第三个文档,如下所示和搜索结果
hvvq6cgz2#
数据复制是任何nosql数据库/服务(包括elasticsearch)的权衡。这里的主要思想是,您不需要一个包含所有可能的城市/州/国家组合的单独索引。
话虽如此,每个用户可能只居住在一个城市。另外,一个人的城市/州/国家经常发生变化是极不可能的。当它出现时,您只需更新该用户的文档。所以频繁的更新(nosql的一个重要缺点)在这里不会引起任何重大的关注。
我建议你
fielddata: true
和/或使您的城市/州/国家字段也成为keyword
数据类型,以便您可以通过使用聚合快速回答诸如“我的大多数用户居住在哪个状态”等问题。重要提示:一定要考虑一些规范化/标准化,尤其是在城市和州。如果我们谈论美国:
有些人可能会进入他们的状态
Massachusetts
,其他为Mass.
,大多数为MA
. 你打算怎么处理?同样地,
NYC
不同于New York
这和New York City
还有new york city
.通常做的是地址自动完成/下拉列表(开源和付费服务都可用),这将为您提供相当多的标准化,以便您可以将用户信息直接保存在您的elasticsearch索引中。也有地理编码方面,但这是一个不同的对话。