elasticsearch java api search
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
long totalCount = hits.getTotalHits();
System.out.println(totalCount);
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String docName = (String) sourceAsMap.get("name");
System.out.println(docName);
}
'언어 > java' 카테고리의 다른 글
elasticsearch + java + index 삭제 (0) | 2019.12.14 |
---|---|
elasticsearch java api : total index search (0) | 2019.04.22 |
크롤링 => json 파일로 적재 (0) | 2019.03.03 |
crawling + json (0) | 2019.02.13 |
자바 그룹스터디 4회차 (0) | 2018.09.25 |
나중에 사용할 테크닉
bar = self.chromeDriver.execute_script("return document.body.scrollHeight")
"""
while True:
print (b)
self.chromeDriver.execute_script("window.scrollTo({up}, {down});".format(up=u, down=b))
if b >= bar:
break
else:
try:
view_btn_more = self.chromeDriver.find_element_by_xpath('//*[@id="recruit_info_list"]/div[2]/a')
except:
pass
else:
view_btn_more.click()
break
u = b
b += 10
'언어 > python' 카테고리의 다른 글
페이스북 - python (0) | 2019.04.24 |
---|---|
python + outlook (0) | 2019.03.31 |
2019년 3월 9일 ( 주말 프로젝트 ) (0) | 2019.03.09 |
data crawling (0) | 2019.03.03 |
python + 지하철 + 이미지 (0) | 2019.02.24 |
2019년 3월 9일 ( 주말 프로젝트 )
import requests
import yaml
class Attr:
@classmethod
def setting(cls):
try:
f = open(Attr.ymlFilePath(), "r", encoding="utf-8")
doc = dict(yaml.load(f))
except FileNotFoundError as e:
print (e)
exit(1)
else:
Attr.urlRequests(dict(doc.get("srv")))
return dict(doc.get("srv"))
@classmethod
def urlRequests(cls, srv):
try:
requests.get("http://{address}:{port}".format(address= srv.get("url"), port= srv.get("port")))
except requests.exceptions.ConnectionError as e:
print(e)
exit(1)
except requests.exceptions.RequestException as e:
print(e)
exit(1)
@classmethod
def ymlFilePath(cls):
filePath = "C:\\Users\\junhyeon.kim\\Desktop\\proj19\\configration\\srv.yml"
return filePath
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
from elasticserver.Attribute import Attr
from requests import get
import os
import json
import pprint
class Elasvr:
attr = Attr.setting()
def __init__(self):
self.elasticSrvr = Elasticsearch(
hosts=[{"host":Elasvr.attr.get("url"),
"port":Elasvr.attr.get("port")}]
)
def srvHealthCheck(self):
srvInfo = dict(self.elasticSrvr.info())
health_check = dict(self.elasticSrvr.cluster.health())
result = json.dumps(
{
"name": srvInfo.get("name"),
"cluster_name": health_check.get("cluster_name"),
"status": health_check.get("status")
},
ensure_ascii=False,
indent=4
)
print (result)
def search(self, param_index, param_search):
srv = Search(using= self.elasticSrvr,
index= param_index).query("match", name=param_search)
#response = srv.execute().to_dict()["hits"]["hits"][0]
response = srv.execute().to_dict()["hits"]["hits"]
if response == []:
return response
else:
'''
_index, _type, _id, _score, _source
'''
print (response[0]["_source"])
return response[0]["_source"]
def __del__(self):
self.elasticSrvr.exists
def main():
enode = Elasvr()
enode.srvHealthCheck()
enode.search(param_index="hex_color_list", param_search="b")
if __name__ == "__main__":
main()
'언어 > python' 카테고리의 다른 글
python + outlook (0) | 2019.03.31 |
---|---|
selenium_ (0) | 2019.03.11 |
data crawling (0) | 2019.03.03 |
python + 지하철 + 이미지 (0) | 2019.02.24 |
pysimplegui (0) | 2019.02.10 |
크롤링 => json 파일로 적재
package eX_.com.sun;
import java.io.FileWriter;
import java.io.IOException;
import org.json.simple.JSONObject;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class CCrwl {
protected String jsonFilePath = "./src/eX_/com/sun/resltFile.json";
public void urlRequest() {
Connection.Response response = null;
FileWriter file = null;
JSONObject obj = null;
try {
obj = new JSONObject();
response = Jsoup.connect("https://www.naver.com/")
.method(Connection.Method.GET)
.execute();
Document htmlDoc = response.parse();
Element data = htmlDoc.selectFirst("ul.ah_l");
Elements datas = data.select("li.ah_item > a");
for (Element d : datas) {
obj.put(d.selectFirst("span.ah_r").text(),
d.selectFirst("span.ah_k").text());
}
file = new FileWriter(jsonFilePath);
file.write(obj.toJSONString());
file.flush();
file.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
'언어 > java' 카테고리의 다른 글
elasticsearch java api : total index search (0) | 2019.04.22 |
---|---|
elasticsearch java api search (0) | 2019.03.13 |
crawling + json (0) | 2019.02.13 |
자바 그룹스터디 4회차 (0) | 2018.09.25 |
stack 을 활용한 swap (0) | 2018.09.02 |
data crawling
from bs4 import BeautifulSoup
from openpyxl import Workbook
from json import load
import requests
import time
from facebook.TargetString import TargetStr
class Facebook:
def __init__(self):
self.requestUrl = Facebook.jsnoFileRead()
self.bsObject = self.urlRequests()
self.targetString = TargetStr.target_string
self.wrkBook = Workbook() # 엑셀 파일 생성
@classmethod
def jsnoFileRead(cls):
try:
f = open("./info.json", "r")
json_doc = dict(load(f))
url = "{url}/{path}?{param}".format(
url = json_doc.get("url"),
path = json_doc.get("path"),
param = json_doc.get("param"))
except FileNotFoundError as e:
print (e)
f.close()
exit(1)
else:
f.close()
return url
def urlRequests(self):
html = requests.get(self.requestUrl)
if html.status_code == 200:
return BeautifulSoup(html.text, "html.parser")
else:
exit(1)
def urlParcing(self):
# work sheet 생성
wrkSheet = self.wrkBook.create_sheet("decoding_list")
table = self.bsObject.select("div#module-codecs > "
"div#standard-encodings > "
"table.docutils > "
"tbody > "
"tr")
encoding_list = [ t.select_one("td").string for t in table ]
for n, i in enumerate(encoding_list):
result_text = self.targetString.decode(i, "ignore")
# wrkSheet.cell(row=n+2, column=2).value = i
# wrkSheet.cell(row=n+2, column=3).value = str(result_text)
time.sleep(1)
print (i, result_text)
def __del__(self):
self.wrkBook.save("facebook.xlsx")
def main():
fnode = Facebook()
fnode.jsnoFileRead()
fnode.urlParcing()
if __name__ == "__main__":
main()
'언어 > python' 카테고리의 다른 글
selenium_ (0) | 2019.03.11 |
---|---|
2019년 3월 9일 ( 주말 프로젝트 ) (0) | 2019.03.09 |
python + 지하철 + 이미지 (0) | 2019.02.24 |
pysimplegui (0) | 2019.02.10 |
python + crawling + elasticsearch (0) | 2019.02.04 |
python + 지하철 + 이미지
from urllib.parse import urlparse
from selenium import webdriver
from bs4 import BeautifulSoup
import json
import time
class X:
def __init__(self):
self.ele = {
"중동역": {"lat":None, "lng":None, "check": "False"},
"부천역": {"lat":None, "lng":None, "check": "False"},
"소사역": {"lat":None, "lng":None, "check": "False"},
"역곡역": {"lat": None, "lng": None, "check": "False"},
"온수역": {"lat": None, "lng": None, "check": "False"},
"오류동역": {"lat": None, "lng": None, "check": "False"},
"개봉역": {"lat": None, "lng": None, "check": "False"},
"구일역": {"lat": None, "lng": None, "check": "False"},
"구로역": {"lat": None, "lng": None, "check": "False"},
"가산디지털단지역": {"lat": None, "lng": None, "check": "False"},
"독산역": {"lat": None, "lng": None, "check": "False"},
"금천구청역": {"lat": None, "lng": None, "check": "False"},
"석수역": {"lat": None, "lng": None, "check": "False"},
"관악역": {"lat": None, "lng": None, "check": "False"},
"안양역": {"lat": None, "lng": None, "check": "False"},
"명학역": {"lat": None, "lng": None, "check": "False"},
"금정역": {"lat": None, "lng": None, "check": "False"},
"범계역": {"lat": None, "lng": None, "check": "False"},
"평촌역": {"lat": None, "lng": None, "check": "False"},
"인덕원역": {"lat": None, "lng": None, "check": "False"},
}
self.webdriv = webdriver.Chrome(X.jsonRead())
@classmethod
def jsonRead(self):
path = ""
try:
with open("./driv_path.json", "r") as json_file:
doc = dict(json.load(json_file))
path = doc.get("path")
except FileNotFoundError as e:
print (e)
return path
def urlReq(self):
self.webdriv.get(url="https://www.google.com/")
# 암묵적으로 웹 자원 로드를 위해 3초까지 기다려 준다
self.webdriv.implicitly_wait(3)
for k in self.ele.keys():
# new window open
windows_before = self.webdriv.window_handles[0]
self.webdriv.execute_script("window.open('');")
windows_after = self.webdriv.window_handles[1]
self.webdriv.switch_to.window(window_name=windows_after)
self.webdriv.get(url="https://www.google.com/")
time.sleep(2)
self.webdriv.find_element_by_xpath('//*[@id="tsf"]/div[2]/div/div[1]/div/div[1]/input')\
.send_keys(k)
try:
self.webdriv.find_element_by_xpath('//*[@id="tsf"]/div[2]/div/div[2]/div[2]/div/center/input[1]')\
.click()
except:
self.webdriv.find_element_by_xpath('//*[@id="tsf"]/div[2]/div/div[3]/center/input[1]')\
.click()
finally:
# =================================
time.sleep(2)
# e = self.webdriv.find_elements_by_css_selector("#hdtb-msb-vis > div > a")
bsobj = BeautifulSoup(self.webdriv.page_source, "html.parser")
e = bsobj.select("#hdtb-msb-vis > div > a")
print (e)
for n, i in enumerate(e):
if i.string == "지도":
print (n+1, i)
self.webdriv.find_element_by_xpath('//*[@id="hdtb-msb-vis"]/div['+ str(n+2) +']/a').click()
time.sleep(10)
url = urlparse(self.webdriv.current_url)
r = str(url.path).split("/")[4]\
.replace("@", "")\
.replace(",17z", "")\
.split(",")
self.ele[k]["lat"], _ = float(r[0]), "위도"
self.ele[k]["lng"], _ = float(r[1]), "경도"
self.ele[k]["check"], _ = "True", "데이터 들어감"
print (k)
# =================================
self.webdriv.close()
self.webdriv.switch_to.window(windows_before)
def mkJson(self):
with open("data.json", "w", encoding="utf-8") as outfile:
json.dump(self.ele, outfile, ensure_ascii=False, indent=4)
# 소멸자
def __del__(self):
self.webdriv.close()
=================================================================
from gmplot import gmplot
from gps_proj.map.m2 import X
# 위도 : 37.4881796
# 경도 : 126.7682477
class M:
node = X()
@classmethod
def first(cls):
cls.node.urlReq()
@classmethod
def doScatterPoint(cls):
gmap = gmplot.GoogleMapPlotter(37.493988, 126.767433, 10)
lat = [ i.get('lat') for i in cls.node.ele.values()]
lng = [ i.get('lng') for i in cls.node.ele.values()]
# gmap.scatter(lat, lng, "#3B0B39", size=40, marker=False)
gmap.plot(lat, lng, "cornflowerblue", edge_width=6)
gmap.draw("t.html")
def main():
M.first()
M.doScatterPoint()
if __name__ == "__main__":
main()
'언어 > python' 카테고리의 다른 글
2019년 3월 9일 ( 주말 프로젝트 ) (0) | 2019.03.09 |
---|---|
data crawling (0) | 2019.03.03 |
pysimplegui (0) | 2019.02.10 |
python + crawling + elasticsearch (0) | 2019.02.04 |
프로젝트 코드 일부분 (0) | 2019.01.20 |
crawling + json
package stuProj19021202;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import stuProj190212.Test;
public class Crlng {
// #########################################
static Connection.Response response = null;
static Document naverDoc = null;
static Element element = null;
static Elements elements = null;
static JSONArray jsonArry = new JSONArray();
static FileWriter fw = null;
// #########################################
public static void urlRequests() {
try {
response = Jsoup.connect("http://www.naver.com")
.method(Connection.Method.GET)
.execute();
naverDoc = response.parse();
element = naverDoc.selectFirst("ul.ah_l");
elements = element.select("li.ah_item a");
for (int i = 0; i < elements.size(); i++) {
JSONObject jsonObj = new JSONObject();
jsonObj.put(elements.get(i).select("span.ah_r").text(), elements.get(i).select("span.ah_k").text());
jsonArry.add(jsonObj);
}
System.out.println(jsonArry);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void mkJsonFile() {
String path = Crlng.class.getResource("").getPath();
try {
fw = new FileWriter(path + "mkjs.json");
fw.write(jsonArry.toJSONString());
fw.flush();
fw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("json file 생성 success !!!");
}
}
'언어 > java' 카테고리의 다른 글
elasticsearch java api search (0) | 2019.03.13 |
---|---|
크롤링 => json 파일로 적재 (0) | 2019.03.03 |
자바 그룹스터디 4회차 (0) | 2018.09.25 |
stack 을 활용한 swap (0) | 2018.09.02 |
list => sort (0) | 2017.12.26 |
pysimplegui
import PySimpleGUI as sg
import requests
from bs4 import BeautifulSoup
class UrlClass:
element = []
@classmethod
def urlRequests(cls, url_parameter):
html = requests.get(url_parameter)
if html.status_code == 200:
bsobj_parameter = BeautifulSoup(html.text, "html.parser")
ul_ah_l = bsobj_parameter.select("ul.ah_l")
for i in ul_ah_l:
if 'data-list' in i.attrs:
for j in i.select("li.ah_item > a:nth-of-type(1)"):
tmp_dict = {"number":j.select_one("span.ah_r").string,
"doc":j.select_one("span.ah_k").string}
cls.element.append(tmp_dict)
return cls.element
class GUI:
@classmethod
def graphic(cls):
layout = [
[sg.Text("데이터 수집 대상 정보 입력", background_color="#a2e8f0", font=("Consolas", 18), justification="center")],
[sg.Text("url", size=(15, 1)), sg.InputText("url", key="_URL_")],
[sg.Button("DO crawling"), sg.Button("Exit")]
]
window = sg.Window("나의 첫 simpleGui").Layout(layout)
while True:
event, values = window.Read()
if event == "Exit":
break
elif event == "DO crawling":
print("values['_url_'] => {}\n".format(values['_URL_']))
sg.Popup('The values are', UrlClass.urlRequests(values['_URL_']))
window.Close()
GUI.graphic()
'언어 > python' 카테고리의 다른 글
data crawling (0) | 2019.03.03 |
---|---|
python + 지하철 + 이미지 (0) | 2019.02.24 |
python + crawling + elasticsearch (0) | 2019.02.04 |
프로젝트 코드 일부분 (0) | 2019.01.20 |
프로젝트 디렉토리 (0) | 2019.01.13 |
python + crawling + elasticsearch
2019 - 02 - 04 산출물
---------------------------
from elasticsearch import Elasticsearch
from json import loads, load
from urllib.parse import urlencode
import requests
from bs4 import BeautifulSoup
import re
from semi_proj.elasticSearchNode import Ela
class NMV:
def __init__(self):
self.__url = None
self.__path = None
self.__param = {"sel":None, "page":None, "date":None, "tg":None}
self.__bsobj = None
self.element = []
def paramSetting(self):
with open("./info.json", "r", encoding="utf-8") as f:
json_doc = loads(f.read())
print (json_doc)
self.__url = json_doc["url"]
self.__path = json_doc["path"]
self.__param["sel"] = json_doc["sel"]
self.__param["date"] = json_doc["date"]
self.__param["tg"] = json_doc["tg"]
f.close()
def indexCreate(self):
Ela.createIndex()
def urlRequests(self):
#page
for p in range(1, 4):
self.__param["page"] = p
param = urlencode(self.__param)
# https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20190202&tg=18&page=1
requ = self.__url + self.__path + "?" +param
html = requests.get(requ)
if html.status_code == 200:
self.__bsobj= BeautifulSoup(html.text, "html.parser")
a_list = list(map(lambda x:x.attrs["href"], self.__bsobj.select("div.tit5 > a")))
for i in a_list:
# print (i)
# ex: => https://movie.naver.com/movie/bi/mi/basic.nhn?code=10200
sub_url = self.__url + i
html = requests.get(sub_url)
if html.status_code == 200:
self.__bsobj= BeautifulSoup(html.text, "html.parser")
info = self.__bsobj.select_one("div.mv_info")
try:
movie_name1 = info.select_one("h3.h_movie > a").string
except AttributeError as e:
print (e)
pass
else:
movie_name2 = re.sub("[\n\r\t]", "", str(info.select_one("strong.h_movie2").string))
# 개요
# #content > div.article > div.mv_info_area > div.mv_info > dl
tmp_summary = self.__bsobj.select_one("#content > div.article > div.mv_info_area > div.mv_info > dl > dd > p")
tmp_dir = {
"movie_name1": movie_name1,
"movie_name2": movie_name2,
"jangr":None,
"nation":None,
"minute":None,
}
for i in range(1, 5):
# ========================
jangr = {} # 장르
nation = {} # 제작 국가
minute = {} # 런타임
day = {} # 개봉일
# ========================
tmp = tmp_summary.select_one("span:nth-of-type({})".format(i))
if i != 3:
tmp = tmp.select("a")
tmp_list = list(map(lambda x:x.string, [x.string for x in tmp]))
tmp_list = list(map(lambda x: re.sub("[\n\r\t ]", "", x.string), tmp_list))
if i == 1:
jangr["jangr"] = tmp_list
tmp_dir["jangr"] = jangr["jangr"]
elif i == 2:
nation["nation"] = tmp_list
tmp_dir["nation"] = nation["nation"]
elif i == 4:
ttmp_list = []
for i in range(0, len(tmp_list), 2):
ttmp_list.append(tmp_list[i] + tmp_list[i+1 ])
day["day"] = ttmp_list
tmp_dir['day'] = day["day"]
else: # i == 3
tmp_list = list(map(lambda x:re.sub("[\n\r\t ]", "",x.string), tmp))
minute["minute"] = tmp_list
tmp_dir["minute"] = minute["minute"]
print (tmp_dir)
self.element.append(tmp_dir)
Ela.dataInsert(self.element)
class T(NMV):
pass
t = T()
# t.indexCreate()
t.paramSetting()
t.urlRequests()
-------------------------------
json 파일
{
"url": "https://movie.naver.com",
"path": "/movie/sdb/rank/rmovie.nhn",
"sel": "pnt",
"date":"20190202",
"tg":"18"
}
------------------------------------------
elasticsearch
from elasticsearch import Elasticsearch
import json
class Ela:
es = Elasticsearch(hosts="192.168.240.129", port=9200)
@classmethod
def createIndex(cls):
# ===============
# 인덱스 생성
# ===============
cls.es.indices.create(
index = "today19020402",
body = {
"settings": {
"number_of_shards": 5
}
}
)
@classmethod
def indexExists(cls, paramindex):
####
# 해당 index가 존재하는가?
####
bool = cls.es.indices.exists(index=paramindex)
print (bool)
@classmethod
def indexCount(cls):
print (cls.es.count(index="today19020402"))
@classmethod
def dataInsert(cls, element):
# ===============
# 데이터 삽입
# ===============
for n, i in enumerate(element):
res = cls.es.index(index="today19020402", doc_type="today", id=n + 1, body=i)
print(res)
Ela.indexExists("today190204012")
Ela.indexCount()
'언어 > python' 카테고리의 다른 글
python + 지하철 + 이미지 (0) | 2019.02.24 |
---|---|
pysimplegui (0) | 2019.02.10 |
프로젝트 코드 일부분 (0) | 2019.01.20 |
프로젝트 디렉토리 (0) | 2019.01.13 |
project 일부 코드 (0) | 2019.01.08 |
프로젝트 코드 일부분
from bs4 import BeautifulSoup
from selenium import webdriver
from urllib.parse import urlparse
import requests as req
from yaml import load
import p01
class Cllct:
def __init__(self):
self.elastic = p01.Elastic
self.url = None
self.path = None
self.bsObj = None
self.element = []
# elasticsearch (1) srv connect
def ElasticSrvConnect(self):
self.elastic.ElasticSrvConnect()
# elasticsearch (2) healthCheck
def ElasticsHealthCheck(self):
self.elastic.ElasticsHealthCheck()
# elasticsearch (3) Data insert
def ElasticsInsertDocument(self):
self.elastic.InsertDocument(x=self.element)
# Instance method (1)
def urlSetting(self):
with open("./CONFIG/info.yaml", "r") as f:
txt = load(f.read())
self.url = txt["url"]
self.path = txt["path"]
f.close()
# Instance method (2)
def requestURL(self):
html = req.get(url=self.url+self.path)
if html.status_code == 200:
self.bsObj = BeautifulSoup(html.text, "html.parser")
mvLst = self.bsObj.find_all("div", {"class":"tit3"})
for indx, vale in enumerate(mvLst):
insertData = {"name":None, "numb":None, "showtime":None, "showday":None, "nation":None}
showt, showd, nation = self.SubInfo(vale.a.attrs["href"]) # Function call
insertData["name"] = vale.a.attrs["title"]
insertData["numb"] = indx+1
insertData["showtime"] = showt
insertData["showday"] = showd
insertData["nation"] = nation
Result = "영화 이름 : {n}, 영화 순위 : {o}, 영화 상영시간 : {t}, 영화 상영날짜 : {d}, 제작 국가 : {s}".\
format(n = insertData["name"], o = insertData["numb"], t = insertData["showtime"],
d = insertData["showday"], s = insertData["nation"])
print (Result)
self.element.append(insertData)
def SubInfo(self, subpath):
nation = None # 제작국가
showtime = None # 상영시간
showday = None # 상영날짜
html = req.get(self.url + subpath)
if html.status_code == 200:
bsObject = BeautifulSoup(html.text, "html.parser")
mvInfo = bsObject.select_one("div.mv_info > dl.info_spec > dd > p")
try:
# 국가
nation = mvInfo.select_one("span:nth-of-type(2) > a").string
except:
return showtime, showday, nation
else:
try:
# 상영시간
showtime = mvInfo.select_one("span:nth-of-type(3)").string
except:
return showtime, showday, nation
else:
try:
# 상영날짜
showday = mvInfo.select_one("span:nth-of-type(4) > a:nth-of-type(2)").attrs["href"]
except:
try:
showday = mvInfo.select_one("span:nth-of-type(3) > a:nth-of-type(2)").attrs["href"]
except:
return showtime, showday, nation
else:
showday = urlparse(showday).query
showday = str(showday).split("=")[1]
# return 순서 : 상영시간, 상영날짜, 국가
return showtime, showday, nation
else:
showday = urlparse(showday).query
showday = str(showday).split("=")[1]
# return 순서 : 상영시간, 상영날짜, 국가
return showtime, showday, nation
def main():
cnode = Cllct() # 객체 생성
cnode.ElasticSrvConnect()
# cnode.ElasticsHealthCheck()
# ------------------------------
cnode.urlSetting()
cnode.requestURL()
cnode.ElasticsInsertDocument()
if __name__ == "__main__":
main()
'언어 > python' 카테고리의 다른 글
pysimplegui (0) | 2019.02.10 |
---|---|
python + crawling + elasticsearch (0) | 2019.02.04 |
프로젝트 디렉토리 (0) | 2019.01.13 |
project 일부 코드 (0) | 2019.01.08 |
Project 일부분 (0) | 2019.01.05 |