Elasticsearch实战——地理位置查询

Elasticsearch实战——地理位置查询


为了方便学习ES的地理位置查询,这里准备了一些地理坐标为测试数据,每一条数据都包含城市名称和地理坐标两个字段。首先把下面的内容保存到 geo.json文件中:

{"index":{"_index":"geo","_id":"1"}}
{"city":"北京","localtion":"40.019559,116.312282"}
{"index":{"_index":"geo","_id":"2"}}
{"city":"乌鲁木齐","localtion":"43.863737,87.53891"}
{"index":{"_index":"geo","_id":"3"}}
{"city":"西安","localtion":"34.43376,108.879774"}
{"index":{"_index":"geo","_id":"4"}}
{"city":"郑州","localtion":"34.76845,113.589482"}
{"index":{"_index":"geo","_id":"5"}}
{"city":"杭州","localtion":"30.345351,120.102125"}
{"index":{"_index":"geo","_id":"6"}}
{"city":"济南","localtion":"36.688506,117.158558"}
{"index":{"_index":"geo","_id":"7"}}
{"city":"上海","localtion":"31.298035,121.426731"}
{"index":{"_index":"geo","_id":"8"}}
{"city":"武汉","localtion":"30.632158,114.28858"}
{"index":{"_index":"geo","_id":"9"}}
{"city":"广州","localtion":"23.150725,113.221536"}

然后创建一个索引:

PUT geo
{
  "settings": {
    "number_of_shards": "1",
    "number_of_replicas": "0"
  },
  "mappings": {
    "properties": {
      "city": {
        "type": "keyword"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

再执行:

$curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' --data-binary @geo.json

1. 半径查询(geo_distance query)

geo_distance query可以查找在一个中心点指定半径范围内的地理文档。例如查询距离天津500km以内的城市,搜索结果会返回北京、济南,命令如下:

{
	"query":{
		"bool":{
			"must":{
				"match_all":{}
			},
			"filter":{
				"geo_distance":{
					"distance":"500km",
					"location":{
						"lat":"38.993443",
						"lon":"117.158558"
					}
				}
			}
		}
	}
}

按距离天津的距离排序:

{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "500km",
          "location": {
            "lat": "38.993443",
            "lon": "117.158558"
          }
        }
      }
    }
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": "38.993443",
          "lon": "117.158558"
        },
        "unit": "km"
      }
    }
  ]
}

2. 指定矩形内的查询(geo_bounding_box query)

geo_bounding_box query用于查询落入指定的矩形内的地理坐标。查询中由两个点确定一个矩形,如图中的银川和南昌,在这两个点上分别做垂线(经度)和平行线(维度),相交线会组成一个矩形区域,可以查询到西安、郑州、武汉。

在这里插入图片描述

左上角和右下角查询

{
	"query":{
		"bool":{
			"must":{
				"match_all":{}
			},
			"filter":{
				"geo_bounding_box":{
					"location":{
						"top_left":{
							"lat":"38.532499",
							"lon":"106.193769"
						},
						"bottom_right":{
							"lat":"28.671728",
							"lon":"115.907542"
						}
					}
				}
			}
		}
	}
}

左下角和右上角查询

{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_right": {
              "lat": "40.807062",
              "lon": "119.108671"
            },
            "bottom_left": {
              "lat": "22.12604",
              "lon": "101.741623"
            }
          }
        }
      }
    }
  }
}

3. 查询指定多边形内的数据(geo_polygon query)

geo_polygon query用于查找指定多边形内的地理点。例如,呼和浩特、重庆、上海三地组成的三角形,查询位置在改三角形区域内的城市。

在这里插入图片描述

{
	"query":{
		"bool":{
			"must":{
				"match_all":{}
			},
			"filter":{
				"geo_polygon":{
					"location":{
						"points":[
							{"lat":"40.835015","lon":"111.712958"},
							{"lat":"29.640695","lon":"106.561715"},
							{"lat":"31.23482","lon":"121.50032"}
						]
					}
				}
			}
		}
	}
}

4 查询geo_shape类型的数据(geo_shape query)

geo_shapequery用于查询geo_shape类型的地理数据,地理形状之间包含的关系有:相交、包含、不相交三种。创建一个新的索引用于测试,其中location字段的类型设置为geo_shape类型:

PUT geoshape
{
  "settings": {
    "number_of_shards": "1",
    "number_of_replicas": "0"
  },
  "mappings": {
    "properties": {
      "city": {
        "type": "keyword"
      },
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

geo_point类型的字段是:纬度在前,经度在后,但是geo_shape类型中的点是:经度在前,纬度在后。这点需要特别注意。

POST geoshape/_doc/1
{
	"city":"西安-郑州",
	"location":{
		"type":"linestring",
		"coordinates":[
			[108.953364,34.372762],
			[113.626277,34.76845]
		]
	}
}

查询包含在由银川和南昌组成的矩形的地理形状内的数据,由于西安和郑州组成的直线落在该矩形区域内,因此可以被查询到。

{
	"query":{
		"bool":{
			"must":{
				"match_all":{}
			},
			"filter":{
				"geo_shape":{
					"location":{
						"shape":{
							"type":"envelope",
							"coordinates":[
								[106.230564,38.50359],
								[115.870747,28.704175]
							]
						},
						"relation":"within"
					}
				}
			}
		}
	}
}

5. 关注我

搜索微信公众号:java架构强者之路
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个项目实战的目标是使用Java版本的Spark将Hive表的数据写入Elasticsearch。具体步骤如下: 1. 首先,需要在Spark中创建一个JavaSparkContext对象,并且设置相关的配置,比如Elasticsearch的地址和端口号等。 2. 接下来,需要使用HiveContext对象来读取Hive表的数据。可以使用HiveContext的sql方法来执行Hive SQL语句,或者使用HiveContext的table方法来读取Hive表的数据。 3. 读取Hive表的数据后,需要将数据转换成Elasticsearch的格式。可以使用JavaRDD的map方法来实现数据的转换。 4. 转换完成后,需要将数据写入Elasticsearch。可以使用JavaRDD的foreachPartition方法来实现数据的批量写入。 5. 最后,记得关闭JavaSparkContext对象。 以上就是使用Java版本的Spark将Hive表的数据写入Elasticsearch的步骤。需要注意的是,具体实现过程中还需要考虑一些细节问题,比如数据类型的转换、数据的去重等。 ### 回答2: 在实现Spark将Hive表的数据写入Elasticsearch的过程中,首先需要搭建好相关的环境,包括Hadoop、Hive和Elasticsearch等。然后,根据Spark的API接口,可以编写相关的Java代码来实现将Hive表的数据写入Elasticsearch的操作。 具体实现步骤如下: 1. 导入相关依赖:在Maven项目中,需要添加以下依赖: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hive.version}</version> </dependency> ``` 其中,${scalaVersion}、${spark.version}、${elasticsearch.version}和${hive.version}需要根据实际情况进行替换。 2. 初始化SparkConf和SparkSession对象:在Java代码中,需要先初始化SparkConf和SparkSession对象: ```java SparkConf conf = new SparkConf().setAppName("Spark-Hive-Elasticsearch"); SparkSession spark = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate(); ``` 其中,setAppName用于设置Spark应用程序的名称,getOrCreate用于获取一个已有的Spark或创建一个新的Spark。 3. 读取Hive表的数据:可以使用SparkSession的read方法读取Hive表的数据,如下所示: ```java DataFrame df = spark.read().table("mytable"); ``` 其中,mytable为Hive表的名称。 4. 配置Elasticsearch索引:在将Hive表的数据写入Elasticsearch时,需要配置相关的索引,如下所示: ```java Map<String, String> esConfig = new HashMap<>(); esConfig.put("es.nodes", "localhost"); esConfig.put("es.port", "9200"); esConfig.put("es.resource", "myindex/mytype"); ``` 其中,es.nodeses.port用于配置Elasticsearch的地址和端口,es.resource用于指定Elasticsearch的索引名称和类型名称。 5. 将Hive表的数据写入Elasticsearch:可以使用DataFrame的write方法将Hive表的数据写入Elasticsearch,如下所示: ```java df.write().format("org.elasticsearch.spark.sql").mode(SaveMode.Append).options(esConfig).save(); ``` 其中,format指定了保存的格式为Elasticsearch格式,mode指定了保存的模式为Append,options指定了保存的配置项。 通过上述步骤,即可实现Spark将Hive表的数据写入Elasticsearch的操作。当然,在实际应用过程中,还需要根据具体需求进行相关的优化和调整。 ### 回答3: 这个项目实战的主要目的是将Hive表的数据写入到Elasticsearch。Hive是Hadoop中的数据仓库,而Elasticsearch则是一个高性能的搜索和分析引擎。将这两个系统结合起来可以实现更好的数据分析和可视化。 在开始实现之前,需要先搭建好Hadoop和Elasticsearch环境,并且熟悉Java编程语言和Spark框架。接下来,可以按照以下步骤进行实现。 第一步:配置Maven项目并添加Spark和Elasticsearch的依赖库。在pom.xml文件中添加以下代码: ``` <!-- Spark --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.5</version> </dependency> <!-- Elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>7.6.2</version> </dependency> ``` 第二步:编写代码读取Hive表的数据。使用Spark SQL读取Hive表数据并将其转换为DataFrame,例如: ``` String tableName = "hive_table_name"; Dataset<Row> df = sparkSession.table(tableName); ``` 第三步:将DataFrame中的数据写入Elasticsearch使用Elasticsearch Spark库提供的API来将数据写入Elasticsearch,例如: ``` // 配置Elasticsearch参数 Map<String, String> esConfigs = new HashMap<>(); esConfigs.put("es.nodes", "localhost"); esConfigs.put("es.port", "9200"); esConfigs.put("es.mapping.id", "id"); // 写入数据 df.write().format("org.elasticsearch.spark.sql") .options(esConfigs).mode("overwrite") .save("index_name/document_type"); ``` 最后一步:运行代码并验证数据是否已经成功写入Elasticsearch。可以使用Kibana界面进行数据可视化展示和分析。 通过以上步骤,就可以成功实现将Hive表的数据写入Elasticsearch的功能。这个项目实战可以帮助开发人员更好地理解和应用Spark和Elasticsearch技术,并且提升数据分析和可视化的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值