-
elasticsearch 시작하기 - bulk index 로 색인하기프로그래밍/검색 2015. 12. 29. 05:28728x90반응형
기본 사용법
D:\es\elasticsearch-1.4.2>curl -s -XPOST "http://localhost:9200/_bulk" --data-binary @bulkdata.json
--data-binary 옵션뒤에 색인할 bulk file을 지정한다.
bulk 색인중에는 bulk file이 다 메모리에 로드되기 때문에
적은 사이즈 (20~30 M)로 나눠서 색인을 하도록 색인 스크립트를 작성하였다.
Linux -command
D:\es\elasticsearch-1.4.2>curl -s -XPOST "http://localhost:9200/_bulk" --data-binary @bulkdata.json
리눅스에서는 주소에 ' 나 "를 붙여도 잘 되지만 윈도우에서는 에러가 나거나 작동 안함
윈도우 - command line
D:\es\elasticsearch-1.6.0\bin>curl -s -XPOST "localhost:9200/_bulk" --data-binary @bulkdata.json
{"error":"ElasticsearchParseException[Failed to derive xcontent from org.elastic
search.common.bytes.BytesArray@1]","status":400}
D:\es\elasticsearch-1.6.0\bin>curl -s -XPOST 'localhost:9200/_bulk' --data-binary @bulkdata.json
작동안함
D:\es\elasticsearch-1.6.0\bin>curl -s -XPOST localhost:9200/_bulk --data-binary@bulkdata.json
제대로 동작bulk file (예시)
{"index":{"_index":"indexname","_type":"typename","_id":"1"}}
{"id":"981146","날짜":"2014-01-01",... ,"총주식수":null}- doc이후의 마지막 라인에 빈 라인이 있지 않으면 no_requests added 에러가 나니 조심할 것. (참고:
http://stackoverflow.com/questions/22996337/elasticsearch-no-requests-added-bulk-api-error)
{ "error": "ActionRequestValidationException[Validation Failed: 1: no requests added;]", "status": 500 }
리눅스 전체 bulk index 스크립트
#!/bin/sh
today=`date '+%Y%m%d'`
jsondir=/home/json/$today
bulkdir=/home/bulk/$today
mkdir ${jsondir}
mkdir ${bulkdir}// table에서 bulk file을 생성하는 스크립트
php extract_bulk_from_table.php > ${jsondir}/bulkdata.json
split_bulk.sh 200000 ${jsondir}/bulkdata.json
curl -XDELETE localhost:9200/indexname// mapping 설정
curl -s -XPOST 'http://localhost:9200/indexname' --data-binary @mapping_unit.jsonfor entry in $bulkdir/*
do
echo "$entry"
curl -s -XPOST 'http://localhost:9200/_bulk' --data-binary @${entry}
done
extract_bulk_from_table.php
<?php
ini_set('memory_limit', '-1');
header("Content-Type: text/html; charset=UTF-8");
$conn = mysqli_connect('localhost', 'id', 'passwd','dbname');
if (mysqli_connect_errno($conn))
{
echo "데이터베이스 연결 실패: " . mysqli_connect_error();
}
$check_query = "select * from tablename";
$result = $conn->query($check_query);
$total_line = "";
while($row = mysqli_fetch_assoc($result)) {
$type = $row['종목코드'];
$total_line = "{\"index\":{\"_index\":\"indexname\",\"_type\":\"".$type."\",\"_id\":\"".$id++."\"}}\n";
$total_line .= json_encode($row, JSON_UNESCAPED_UNICODE );
$total_line .= "\n";
echo $total_line;
}
?>
mapping_unit.json
{
"settings" : {
"analysis": {
"filter": {
"my_shingle_filter": {
"type": "shingle",
"output_unigrams": false
}
},
"analyzer" : {
"my_shingle_analyzer": {
"type": "custom",
"tokenizer" : "standard",
"filter": [
"my_shingle_filter"
]
}
}
}
},
"mappings" : {
"_default_" : {
"properties" : {
"4일종가합" : {
"type" : "string"
},"종목" : {
"type" : "string",
"index" : "not_analyzed"
},
....
"현재가" : {
"type" : "string"
}
}
}
}
}728x90반응형'프로그래밍 > 검색' 카테고리의 다른 글
elasticsearch 시작하기 - slowlog 사용하기 (0) 2016.06.26 리눅스에 kibana 4.1.2 설치하기 (0) 2016.01.01 elasticsearch - mapping 확인하기 (0) 2015.12.26 elasticsearch - failed to delete index (0) 2015.07.23 윈도우 서버 2012에 엘라스틱검색 1.6 설치하기 (0) 2015.06.28