如何在 Elasticsearch 中存储国家/州/城市信息



如何在 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 ...)

请不要将Elasticsearch与RDBMS混淆,并且由于您没有提到您的用例是什么,即全文搜索或聚合,我将向您展示如何使用您的数据实现全文搜索,并且易于实现并且不需要太多的配置/复杂性即可实现。

由于一次一个用户只能停留在一个城市、州和国家/地区,但如果您想为用户存储多个选项,这些选项也可以完成,您只需索引,分隔值即可。

如果您需要对这些字段进行聚合,请将这些字段索引为keyword,以便您可以对其进行聚合。

全文搜索的完整示例

索引映射

{
"mappings" :{
"properties" :{
"first_name" :{
"type" : "text"
},
"last_name" :{
"type" : "text"
},
"country" :{
"type" : "text"
},
"state" :{
"type" : "text"
},
"city" :{
"type" : "text"
}
}
}
}

索引示例文档

{
"first_name" : "abc",
"last_name" : "xyz",
"country": "USA",
"state" : "California",
"city" : "SF"
}
{
"first_name" : "opster",
"last_name" : "ninja",
"country": "Israel",
"state" : "na",
"city" : "tel aviv"
}
{
"first_name" : "abc",
"last_name" : "xyz",
"country": "USA",
"state" : "California, washintion", // not two state
"city" : "SF"
}

现在搜索California将返回第一个和第三个文档,如下所示

{
"query": {
"match": {
"state": "california"
}
}
}

和搜索结果

"hits": [
{
"_index": "so_63601020",
"_type": "_doc",
"_id": "3",
"_score": 0.38845783,
"_source": {
"first_name": "abc",
"last_name": "xyz",
"country": "USA",
"state": "California",
"city": "SF"
}
},
{
"_index": "so_63601020",
"_type": "_doc",
"_id": "2",
"_score": 0.2863813,
"_source": {
"first_name": "foo",
"last_name": "bar",
"country": "USA",
"state": "California, washington",
"city": "SF"
}
}
]

数据复制是任何NoSQL数据库/服务的权衡,包括ElasticSearch。这里的主要思想是,您不需要包含所有可能的城市/州/国家/国家组合的单独索引。

话虽如此,每个用户可能只居住在一个城市。此外,一个人的城市/州/国家经常改变的可能性极小。当它发生时,您只需更新该用户的文档。因此,频繁的更新(NoSQL的一个重要缺点)在这里不会有任何重大问题。

我建议的是确保你设置fielddata: true和/或使你的城市/州/国家/地区字段也具有keyword数据类型,以便你可以通过使用聚合快速回答诸如"我的大多数用户居住在哪个州?"等问题。

重要提示:一定要考虑一些规范化/标准化,尤其是在城市和州方面。如果我们谈论美国:

  • 有些人可能以Massachusetts的身份进入他们的状态,有些人以Mass.的身份进入他们的状态,大多数人以MA的身份进入他们的状态。你打算如何处理?
  • 同样,NYC不同于New York,也不同于New York City,也不同于new york city

通常做的是地址自动完成/下拉(开源和付费服务都可用),它将为您提供相当数量的标准化,因此您可以直接将用户信息保存在 elasticsearch 索引中。还有地理编码方面,但这是一个不同的对话。

最新更新