거지같은거 금방 할줄 알았는데 생각보다 오래걸렸기도 하고 서치한 내용이 잘 나오지도 않아서 올려놓는 내 삽질 일기
검색엔진인 엘라스틱서치는 다양한 방식으로 역색인을 하는 과정을 거친다.
타입 지정을 해주지 않더라도 알아서 타입도 넣어주고 이것저것을 해주는데, 그럴 경우 자연스럽게 메모리 누수가 발생한다.
대표적인 예를 들면 사람의 나이는 아무리 많아도 120세(...?)를 넘지 않을 것이다.
하지만 숫자가 타입 없이 다이나믹 매핑으로 지정될 경우에는 long으로 지정이 되는데,
이 경우 수가 -2^63~2^63-1이라서 엄청난 손해가 발생된다.
이것을 위해서 손수 매핑을 해주는 과정이 필요하고,
이것을 통합적으로 사용하기 위해서는 새로운 template.json을 만들어서 logstash에 박아버리면 알아서 처리를 해주게 된다.
근데! 이게! 내가 찾은거에는! 제대로 없어서! 걍 내가 적는다.
끗
{
"template": "post-*",
// 이건 파일 이름을 뜻한다.
// -*를 박아놓으면 모조리 다 끌어올 수 있는 것 같긴 한데 이부분은 자세하게 확인이 안됐다.
"index_patterns": ["*"],
// 인덱스패턴을 넣어놓으면 어떤 인덱스에 적용이 되는지 지정할 수 있다.
// "*"로 넣어놓으면 모든 인덱스에 다 지정되서 엉망진창이 되버릴 수 있기 때문에
// 다중 파이프라인을 구성해놓는다면, 특정 인덱스를 지정하는 것이 좋다.
"order": "1",
// 템플릿이 적용되는 우선순위를 이야기하는 것으로 인지하고 있다. 1이 제일 높고 1로 설정할 경우 제일 먼저 사용된다.
"settings": {
"refresh_interval": "5s",
// 이것은 리프레시 되는 시간을 이야기한다. 설정을 안하면 1초
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": "1",
"max_gram": "10"
// nGram 타입은 글자를 쪼갠 것을 이야기한다.
// 이거 어디서 자세히 봤는데 나중에 찾으면 올려두겠다.
}
}
},
"max_ngram_diff": "20"
},
// 이부분은 수업에 쓴 것을 그대로 가져온 것인데
// text지만 wildcard의 옵션을 사용하고 싶어서 그대로 가져왔다.
// 내가 만드는 것은 음식리뷰 사이트인데 내용을 일반적인 스탠다드 아날라이저 방식으로 자르면 제대로 볼 수 없어서 이렇게 해놨다.
// 사실 내용들 중 을,를,이,가 이런거를 제외하는 설정을 따로 만들면 되는데
// 영어의 경우는 아예 필터가 존재하지만, 한국어는 이것을 새로 만들어줘야하기 때문에 그냥.... 그냥 저렇게 해놨다.
// 나중에 제대로 알게 된다면 한국어 전용 필터를 만들어놓을 예정이다. 모든것을 다 역색인하기 때문에 긴 시간이 필요해서 별로다.
"mappings": {
"properties": {
"title": {
"type": "text",
analyzer": "my_ngram_analyzer",
"fields": {
"keyword": { "type": "keyword" }
}
},
"contents": {
"type": "text",
"analyzer": "my_ngram_analyzer",
"fields": {
"keyword": { "type": "keyword" }
}
},
"writer": {
"type": "text",
analyzer": "my_ngram_analyzer",
"fields": {
"keyword": { "type": "keyword" }
}
},
// 나는 제목,내용,작성자에 멀티필드로 text와 keyword 속성을 부여했다.
// 솔직히 비효율의 끝을 달린다고 생각하는데, 보통 게시판을 생각해보면 작성자 전부를 치지 않고 일부만 쳐도 나오는 경우가 있다.
// 그런 것이 위에 nGram이 쪼개져있는 text 형식으로 입력되있는 것이라 추가를 둘 다 적용을 해놨다.
"tag": { "type": "text" },
"name": { "type": "text" },
"hit": { "type": "long" },
// 조회수같은 경우에는 큰 수가 찍힐 수도 있다고 판단, long을 넣어놨다.
"like_count": { "type": "short" },
// 좋아요의 경우는 큰 수가 찍히기는 힘들다고 생각해서 short를 넣어놨다
"post_id": { "type": "keyword" }
// post_id의 경우는 PK라서 keyword로 설정을 해놓은 상태다.
}
}
}
logstash:
image: logstash:7.17.0
volumes:
- ./elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./elk/logstash/mysql-connector-java-8.0.28.jar:/usr/share/logstash/mysql-connector-java-8.0.28.jar
- ./elk/logstash/post_template.json:/usr/share/logstash/post_template.json
// 그냥 딱 필요한 부분만 가져온 상태다.
// 새로운 json 파일을 만들었다면, 그것을 도커에 연결을 시켜주는 작업을 해야하는데
// volumes에 자신이 넣어놓은 파일 경로 + 파일 이름을 앞에 적고 뒤에는 원하는 경로를 적어놓으면 된다.
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "post"
document_id => "%{post_id}"
// 이건 내가 자동 업데이트를 해주고 싶어서 따로 설정해준 값이다.
// post_id는 PK라서 유일한 값인데, 수정사항이 있다면 위에 input에서 캐치를 해서 파일을 업데이트 해준다.
manage_template => true
// 만약 내가 깜빡했더라도 다이나믹 매핑이 되도록 설정해놨다.
// false로 꺼놓으면 완벽하게 다 입력해놔야지 안그러면 에러난다
template => "/usr/share/logstash/post_template.json"
// 이것은 json파일의 파일 경로다. 경로는 docker-compose.yaml 파일과 동일하게 쓰면 된다.
template_name => "post"
// 이것은 template.json파일의 template에 넣은 이름을 적어넣으면 된다.
template_overwrite => true
// 새롭게 매핑하시겠습니까? 라는 옵션이다. true로 넣어놓으면 커스텀해놓은 것으로 매핑된다.
}
}
진짜 개짜증났는데 도커에 파일 연결도 안해놓고 화내고 있어서 걍 김이 다 빠졌다.
책도 샀고 엘라스틱서치가 개인적으로 엄청 재밌어서 공부는 더 해볼 예정이다
일단 logstash로 객체좀 만들어봐야할 것 같고
아날라이저도 좀 직접 건드려서 커스텀을 더 해볼 예정이다.
이해를 못할 에러가 발생하고 있다.
분명 자기 전까지는 커스텀 필터가 작동이 됐는데....?
자고 일어났더니 작동이 안된다 ㅠ_ㅠ
고쳐야지....
작업하는 깃헙주소 https://github.com/yukina1418/mainproject/tree/master