[Flutter] Elasticsearch 앱 통신 방법들

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,),
            );
          },
        ),
      ),
    );
  }
}

답글 남기기

이메일 주소는 공개되지 않습니다.