안녕하세요. 우선 위 데이터들이 클라우드에 있는 elasticsearch 안에 색인이 되어야 하는데요, json 파일이 저장되어 있는 동일한 머신에서 filebeat 으로 데이터를 긁어오거나, API로 제공이 된다면 logstash로 가져올 수 있습니다.
올려주신 링크에 있는 json 파일은 형식이 좀 잘못되어 있네요. 첫 줄에 { 는 빠져 있어야 하고, elasticsearch로 가져오기 위해서는 각 도큐먼트는 1열에 있어야 합니다. 그리고 도큐먼트별로 , 구분자가 있는걸 보니 원 문서는 혹시
{
"data":[
{"link":"https://www.fastcompany.com/90205905/bitcoins-price-spiked-this-week-and-this-time-it-didnt-immediately-crash",
"pDate":"{'datetime': '2018-07-20T17:50:20Z'}",
"title":"Bitcoin’s price spiked this week, and this time it didn’t immediately crash",
"description": "Earlier this week, ... how long it lasts."},
{"link":"https://www.fastcompany.com/90205247/dont-count-russia-out-experts-warn-on-election-hacking-amid-relative-calm",
"pDate":"{'datetime': '2018-07-19T20:00:50Z'}",
"title":"“Don’t count Russia out,” experts warn on election hacking amid relative calm",
"description": "As the 2018... "},
...
]
}
이런 형태였을 것으로 예상이 됩니다.
이 경우에는 logstash 또는 ingest pipeline 의 split 필터를 이용해서 데이터를 분리해낼 수 있습니다. 그렇기 위해서는 저 파일의 전체 데이터가 1줄로 되어 있어야 합니다.
일단 입력하시면 필드는 자동으로 만들어지겠지만
- link,
- pDate.datetime
- title
- description
4개의 필드가 나오겠네요. 그래프 분석을 하고 싶은 필드가 어떤 필드인지를 보시고 그 필드는 매핑을 설정하실때
fileddata:true
설정을 추가해야 합니다. 메모리 소모가 많아 별로 권장되지는 않는 설정이지만 오상윤님이 목적하시는 기능에는 필요하실 것 같고요.
제가 볼때 content 필드는 내용이 많아 위험이 좀 있어 보이고 title 필드 정도는 가능할 것 같습니다. 가장 좋은 것은 데이터 색인 전에 미리 분석할 토큰들을 별도로 keyword 타입으로 넣는 것인데, 그건 또 새로 프로그램을 짜야 해서 공수가 들어갈 것 같습니다.
logstash 필터, ingest pipeline 은 답글로 설명 드리긴 내용이 방대해서,
https://www.elastic.co/kr/webinars/getting-started-logstash
여기 있는 내용을 우선 한번 보시고 숙지 하시길 권장드립니다.
ps.
맨 위에 설정된 형식으로 데이터를 가져온다고 가정하고 logstash 설정 파일 알려드리겠습니다.
입력으로 http_poller
를 쓰면 로그스태시를 크롤러 처럼 사용할 수 있습니다.
파일을 직접 읽으실꺼면 file
또는 beats
를 사용하시면 됩니다.
input {
http_poller {
urls => {
news => "http://블라블라뉴스.com/무슨무슨API"
}
request_timeout => 60
schedule => {
every => "10m"
}
}
filter {
split {
field => "data"
}
date {
match => [ "[data][pDate][datetime]", "yyyy-MM-dd'T'HH:mm:ssZ"]
}
}
output {
elasticsearch {
hosts => ["<elastic_cloud가 있는 호스트의>:<elasticsearch http 포트>"]
user => "<사용자>"
password => "<암호>"
index => "<인덱스명>"
document_type => "_doc"
}
}