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

wlp8pajw  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(507)

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

qpgpyjmq1#

请不要混淆elasticsearch和rdbms,因为您没有提到什么是您的用例,即它的全文搜索或聚合,我将向您展示如何使用您的数据实现全文搜索,它很容易实现,并且不需要太多配置/复杂性来实现。
由于一个用户一次只能停留在一个城市、州和国家,但如果您想为用户存储多个选项,也可以这样做,您只需索引 , 分隔的值。
如果您需要这些字段的聚合,请将这些字段索引为 keyword 这样你就可以对它进行聚合了。
全文搜索的完整示例
索引Map

{
  "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"
                }
            }
        ]
hvvq6cgz

hvvq6cgz2#

数据复制是任何nosql数据库/服务(包括elasticsearch)的权衡。这里的主要思想是,您不需要一个包含所有可能的城市/州/国家组合的单独索引。
话虽如此,每个用户可能只居住在一个城市。另外,一个人的城市/州/国家经常发生变化是极不可能的。当它出现时,您只需更新该用户的文档。所以频繁的更新(nosql的一个重要缺点)在这里不会引起任何重大的关注。
我建议你 fielddata: true 和/或使您的城市/州/国家字段也成为 keyword 数据类型,以便您可以通过使用聚合快速回答诸如“我的大多数用户居住在哪个状态”等问题。
重要提示:一定要考虑一些规范化/标准化,尤其是在城市和州。如果我们谈论美国:
有些人可能会进入他们的状态 Massachusetts ,其他为 Mass. ,大多数为 MA . 你打算怎么处理?
同样地, NYC 不同于 New York 这和 New York City 还有 new york city .
通常做的是地址自动完成/下拉列表(开源和付费服务都可用),这将为您提供相当多的标准化,以便您可以将用户信息直接保存在您的elasticsearch索引中。也有地理编码方面,但这是一个不同的对话。

相关问题