Flutter에서 Elasticsearch를 통해 내 주변에 있는 제일 가까운 역이 어디인지 구현해보겠다.
현재 내위치는 실제 값이 아닌 가정한 값을 사용함.
Elasticsearch 데이터 준비
Mapping
PUT my_geo
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
벌크로 데이터 삽입
PUT my_geo/_bulk
{"index":{"_id":"1"}}
{"station":"강남","location":{"lon":127.027926,"lat":37.497175},"line":"2호선"}
{"index":{"_id":"2"}}
{"station":"종로3가","location":{"lon":126.991806,"lat":37.571607},"line":"3호선"}
{"index":{"_id":"3"}}
{"station":"여의도","location":{"lon":126.924191,"lat":37.521624},"line":"5호선"}
{"index":{"_id":"4"}}
{"station":"서울역","location":{"lon":126.972559,"lat":37.554648},"line":"1호선"}
elastic_client Package를 통한 elasticsearch 통신 방법
https://pub.dev/packages/elastic_client
elastic_client: ^0.2.1
실행할 부분에 해당 코드 Elasticsearch IP부분만 수정하고 추가
@override
void initState() {
Uri uri = Uri.parse("http://[hostIP]:9200/"); /// elasticsearch IP
final config = HttpTransport(url: uri);
final client = Client(config);
SearchResult result = await client.search(
index: "my_geo",
query: {
"geo_distance": {
"distance": "5km",
"location": {
"lat": 37.5358,
"lon": 126.9559
}
}
}
);
}
}
앱 검색 결과

검색 결과
Dio 패키지를 통한 Elasticsearch 통신 방법
dio 패키지 설치
https://pub.dev/packages/dio/install
dio: ^3.0.10
x-pack 보안이 비활성화 되어 있을 경우 헤더 Authorization, 매개변수 부분 주석 또는 삭제 필수
import 'dart:convert' as convert;
import 'dart:convert';
import 'package:dio/dio.dart';
class ElasticsearchPost{
Future<Response> post({String username, String password}) async {
final up = convert.utf8.encode('$username:$password');
final basicAuthorization = 'Basic ${convert.base64Encode(up)}';
return await Dio().postUri(
Uri.parse("http://[hostIP]/_sql?format=json",),
data: {
"query": """
SELECT * FROM "hagwon" limit 1
"""
},
options: Options(
headers: {
'Content-Type' : 'application/json',
'Authorization' : basicAuthorization,
}
)
);
}
}
x-pack 보안이 비활성화 되어 있을 경우 매개변수 삭제
import 'package:blog/Test/elasticsearchTest.dart';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
class ElasticSearchTestPage extends StatefulWidget {
@override
_ElasticSearchTestPageState createState() => _ElasticSearchTestPageState();
}
class _ElasticSearchTestPageState extends State<ElasticSearchTestPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: FutureBuilder(
future: ElasticsearchPost().post(username: "user", password: "password"),
builder: (BuildContext context, AsyncSnapshot<Response> _) {
if(!_.hasData){
return Center(
child: CircularProgressIndicator(),
);
}
var a = _.data.data;
print(a);
return Container(
alignment: Alignment.center,
child: Text("${a}", textAlign: TextAlign.center,),
);
},
),
),
);
}
}