【问题标题】:How to store country/state/city information in Elasticsearch如何在 Elasticsearch 中存储国家/州/城市信息
【发布时间】:2020-08-26 15:37:40
【问题描述】:

如何在 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 spring-data-elasticsearch


【解决方案1】:

请不要将 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"
                }
            }
        ]

【讨论】:

    【解决方案2】:

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

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

    建议您确保设置fielddata: true 和/或将您的城市/州/国家/地区字段也设置为keyword 数据类型,这样您就可以快速回答诸如“我的大多数用户居住在哪个州?”等通过使用aggregations

    重要:请考虑一些规范化/标准化,尤其是。当涉及到城市和州。如果我们谈论美国:

    • 有些人可能会以Massachusetts,其他人以Mass.,大多数人以MA 进入他们的状态。你打算怎么处理?
    • 同样,NYCNew York 不同,New York Citynew york city 也不同。

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

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2014-09-08
      • 1970-01-01
      相关资源
      最近更新 更多