Skip to content

기술공유 7주차

KyungHoYoon edited this page Dec 13, 2019 · 38 revisions

엘라스틱서치는 Apache Lucene(이하 루씬)을 기반으로 만들었다. 루씬은 역색인(각각의 단어가 어느 문서에 속해있는지 목록을 유지하는 자료구조 생성)을 제공한다.

엘라스틱서치와 관계형 데이터베이스

elasticSearch 구축 elasticsearch 구축

(1) 사이트에서 정보를 요청한다. (2) 우선 S3(object storage)에 저장된 요청 정보가 있는지 확인한다. (한번 읽어온 정보는 최대 100MB 공간을 마련해서 S3에서 다시 읽을 필요없도록 저장하고 있는다. 최대 용량 초과 시 참조하지 않는 결과부터 삭제). 원하는 결과가 있을 경우 바로 (5)번으로. (3) S3에 저장된 결과가 없다면 ES에 직접 쿼리한다. (4) (3)에서 얻어온 결과를 S3에 저장하고, 메모리에도 저장해둔다. (5) 검색된 결과를 돌려준다.

config/elasticsearch.yml 수정

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
 network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
# http.port: 9200

logstash 파이프라인 생성

/* logstash.conf */

input {    
    jdbc {        
        jdbc_driver_library => "lib/mysql-connector-java-5.1.33.jar"        
        jdbc_driver_class => "com.mysql.jdbc.Driver"        
        jdbc_connection_string => "jdbc:mysql://localhost:3306/[db-name]"        
        jdbc_user => "[db-user]"        
        jdbc_password => "[password]"        
        statement => "SELECT * FROM [tbl-name]"        
        schedule => "* * * * *"                
    }    
}
output {    
    elasticsearch {        
        hosts => ["localhost:9200"]    
    }    stdout {        
        codec => rubydebug    
    }
}

$ curl -X POST http://ip:9200/test

{  
    "mappings" : {    
        "users" : {      
            "properties" : {        
                "index" : { "type" : "integer" },        
                "email" : { "type" : "string" },        
                "nickName" : { "type" : "string"},        
                "tag" : { "type" : "string"}
            }    
        }  
    }
}

데이터 조회 curl -XGET http://211.249.49.243:9200/netflix-db-server/_search?pretty

select video_id, name, category, likes, reg_date,
thumbnail_img_url, thumbnail_video_url, like_cnt
from videos a,
(
select fk_video_id, count(fk_video_id) as "like_cnt"
from likes
where fk_user_id in(
	select fk_user_id
    from likes
    where fk_video_id=1197
    and fk_user_id not in (2)
)
group by fk_video_id
order by like_cnt desc
) b
where a.video_id = b.fk_video_id
order by like_cnt desc;

DSL QUERY

async function get_search(column, target, order, size){

    return await client.search({
        index: process.env.index,
        type: '_doc',
        sort : [`${column} : ${order}`],
        body: {
            size : size,
            query: {
                match : {
                    [column] : target
                }
                
            
            }
        }
    }).then(function(resp){
        return resp.hits.hits;
    },function(err){
        return err;
    })

};

nginx 로그 수집

Clone this wiki locally