티스토리 뷰
결과 및 요약
- 구버전에서의 percolator API 처럼 쓸수 있을것 같음
- default_field 매핑 잡고 쿼리에 기본 값으로 넣어둬야 함
- percolate search query 에서 query_string 쓸꺼면 bool query 로 말아두어야 함
- 프로덕션 레벨에서 사용하기 위한 추가 검증 필요 사항
- routing 적용 여부
- projectName 필드 고정
배경
- percolate query POC
준비
- elasticsearch oss 버전
- 다른 작업은 하지 않고 percolate 만 할 예정이므로 최소한의 기본 설정으로 가동
- 실행
- bin/elasticsarch -d
- 실행 후 동작 확인
xephysis@heejun con % curl localhost:9200
{
"name" : "heejun.local",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "u_Cqt2vDTmykoKYsFQDFEQ",
"version" : {
"number" : "7.10.2",
"build_flavor" : "oss",
"build_type" : "tar",
"build_hash" : "747e1cc71def077253878a59143c1f785afa92b9",
"build_date" : "2021-01-13T00:42:12.435326Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
가이드에 따른 최초 검증
percolate 에 사용할 인덱스 생성
- 요청
curl -X PUT "localhost:9200/nelo2-percolate?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"message": {
"type": "text"
},
"query": {
"type": "percolator"
}
}
}
}
'
- 응답
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "nelo2-percolate"
}
percolate 에서 사용할 쿼리? 저장
- 요청
curl -X PUT "localhost:9200/nelo2-percolate/_doc/1?refresh&pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"message": "xephysis"
}
}
}
'
- 응답
- 문서 아이디 1번으로 생성
{
"_index" : "nelo2-percolate",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"forced_refresh" : true,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
등록된 문서가 잘 검색되는지 검증 (percolate API 기능 확인)
없는 요청
curl -X GET "localhost:9200/nelo2-percolate/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"percolate": {
"field": "query",
"document": {
"message": "lolem ipsum"
}
}
}
}
'
- 응답
- 기대한것처럼 아무것도 나오지 않음
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
있는 요청
- 요청
curl -X GET "localhost:9200/nelo2-percolate/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"percolate": {
"field": "query",
"document": {
"message": "xephysis test"
}
}
}
}
'
- 응답
- 기대한것처럼 동작
{
"took" : 28,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.13076457,
"hits" : [
{
"_index" : "nelo2-percolate",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.13076457,
"_source" : {
"query" : {
"match" : {
"message" : "xephysis"
}
}
},
"fields" : {
"_percolator_document_slot" : [
0
]
}
}
]
}
}
percolate 에서 사용할 쿼리? 추가 저장
- 요청
curl -X PUT "localhost:9200/nelo2-percolate/_doc/2?refresh&pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"message": "test"
}
}
}
'
- 응답
- 문서 아이디 2번으로 생성
{
"_index" : "nelo2-percolate",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"result" : "created",
"forced_refresh" : true,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
- 요청
curl -X GET "localhost:9200/nelo2-percolate/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"percolate": {
"field": "query",
"document": {
"message": "xephysis test"
}
}
}
}
'
- 응답
- 등록해 둔 두개 문서 모두 검색됨
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.13076457,
"hits" : [
{
"_index" : "nelo2-percolate",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.13076457,
"_source" : {
"query" : {
"match" : {
"message" : "xephysis"
}
}
},
"fields" : {
"_percolator_document_slot" : [
0
]
}
},
{
"_index" : "nelo2-percolate",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.13076457,
"_source" : {
"query" : {
"match" : {
"message" : "test"
}
}
},
"fields" : {
"_percolator_document_slot" : [
0
]
}
}
]
}
}
중간정리
- 기본 동작 확인
- percolate api 는 구버전에서 사용되는 percolate query 와 응답 형상이 많이 다름
- 기존 처럼 루씬 쿼리를 저장해 놓고 문서를 통째로 넘겨서 쓰는게 가능할지
예전 처럼 동작하는걸 의도 - 쿼리 등록
- 최초 시도
curl --location --request PUT 'localhost:9200/nelo2-percolate/_doc/3?refresh&pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"query_string": {
"query": "projectName:\"xep-test\" AND host:\"xep-local\" body:xep*",
"lowercase_expanded_terms": false,
"default_operator": "AND",
"analyze_wildcard": true,
"default_field": "body"
}
}
}'
- 문제 발생
"reason": "[query_string] query does not support [lowercase_expanded_terms]",
- 옵션이 현재버전에서는 없어졌으므로 제거
"reason": "No field mapping can be found for the field with name [body]",
- 최초로 인덱스 등록하던 시점에 body에 대한 매핑에 없으므로 에러 발생 옵션 제거
"reason": "No field mapping can be found for the field with name [*]",
- ????
- query_string 이 안먹는건 아닐텐데
- 매핑을 고치고 body 필드를 잡아두는걸로
curl --location --request PUT 'localhost:9200/nelo2-percolate/_mapping?pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"properties": {
"body": {
"type": "text"
},
"message": {
"type": "text"
},
"query": {
"type": "percolator"
}
}
}'
- 매핑이 등록되었으므로 쿼리 등록 재시도
- 요청
curl --location --request PUT 'localhost:9200/nelo2-percolate/_doc/3?refresh&pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"query_string": {
"query": "projectName:\"xep-test\" AND host:\"xep-local\" AND body:xep*",
"default_operator": "AND",
"analyze_wildcard": true,
"default_field": "body"
}
}
}'
- 응답
{
"_index": "nelo2-percolate",
"_type": "_doc",
"_id": "3",
"_version": 1,
"result": "created",
"forced_refresh": true,
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}
- 성공
- default_field 가 없으면,
[*]
를 대상으로 쿼리를 수행하려고 하는걸로 보이며 default_field 옵션이 필수로 보임
- default_field 가 없으면,
예전 처럼 동작하는걸 의도 - 쿼리 검색 요청
- 요청
curl --location --request GET 'localhost:9200/nelo2-percolate/_search?pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"percolate": {
"field": "query",
"document": {
"body": "xephysis test",
"projectName":"xep-test",
"host":"xep-local",
"logTime": 1625624607
}
}
}
}
'
- 응답
- 기대했던 응답 결과가 나오지 않음
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
- 쿼리 수정
- 최초
"query": "projectName:\"xep-test\" AND host:\"xep-local\" AND body:xep*",
- 변경
"query": "projectName:\"xep-test\""
- 결과
- 동일
- 등록된 쿼리로 문서를 검색하지 못하는 상황일지 반대로 검증
- 최초
문서 저장 및 검색 재시도
- 인덱스 생성 요청 및 결과
curl --location --request PUT 'localhost:9200/nelo2-log-20210707?pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"mappings": {
"properties": {
"body": {
"type": "text"
}
}
}
}'
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "nelo2-log-20210707"
}
- 문서 저장 요청 및 결과
curl --location --request POST 'localhost:9200/nelo2-log-20210707/_doc' \
--header 'Content-Type: application/json' \
--data-raw '{
"body": "xephysis test",
"projectName":"xep-test",
"host":"xep-local",
"logTime": 1625624607
}'
{
"_index": "nelo2-log-20210707",
"_type": "_doc",
"_id": "nFwdf3oBfPMe2V132M4l",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
- 문서 조회 요청 및 결과
curl --location --request GET 'localhost:9200/nelo2-log-20210707/_doc/nFwdf3oBfPMe2V132M4l?refresh&pretty' \
--header 'Content-Type: application/json'
{
"_index": "nelo2-log-20210707",
"_type": "_doc",
"_id": "nFwdf3oBfPMe2V132M4l",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"body": "xephysis test",
"projectName": "xep-test",
"host": "xep-local",
"logTime": 1625624607
}
}
- 문서 검색 요청 및 결과
curl --location --request GET 'localhost:9200/nelo2-log-20210707/_search' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"query_string": {
"query": "projectName:\"xep-test\"",
"default_operator": "AND",
"analyze_wildcard": true,
"default_field": "body"
}
}
}'
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.5753642,
"hits": [
{
"_index": "nelo2-log-20210707",
"_type": "_doc",
"_id": "nFwdf3oBfPMe2V132M4l",
"_score": 0.5753642,
"_source": {
"body": "xephysis test",
"projectName": "xep-test",
"host": "xep-local",
"logTime": 1625624607
}
}
]
}
}
- 문서 검색 요청 및 결과
curl --location --request GET 'localhost:9200/nelo2-log-20210707/_search' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"query_string": {
"query": "projectName:\"xep-test\" AND host:\"xep-local\" AND body:xep*",
"default_operator": "AND",
"analyze_wildcard": true,
"default_field": "body"
}
}
}'
{
"took": 47,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 2.1507282,
"hits": [
{
"_index": "nelo2-log-20210707",
"_type": "_doc",
"_id": "nFwdf3oBfPMe2V132M4l",
"_score": 2.1507282,
"_source": {
"body": "xephysis test",
"projectName": "xep-test",
"host": "xep-local",
"logTime": 1625624607
}
}
]
}
}
- 문서를 저장하고 query_string 으로 검색하는 것음 잘 됨 특이사항 없음
- 퍼콜레이트 쪽에서만 문제가 발생한다?
- 아니면 퍼콜레이트 쓰려고 만들어 둔 곳에 매핑정보가 없어서?
- body 말고 다른 필드들도 매핑 정보 등록해보고 검증
- 퍼콜레이트용 인덱스에 매핑 추가 수정
curl --location --request PUT 'localhost:9200/nelo2-percolate/_mapping?pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"properties": {
"body": {
"type": "text"
},
"projectName": {
"type": "keyword"
},
"host": {
"type": "keyword"
},
"logTime": {
"type": "date"
},
"message": {
"type": "text"
},
"query": {
"type": "percolator"
}
}
}'
중간 요약 2
- 퍼콜레이트 인덱스에 매핑 등록 후에도 결과는 동일
- 어떤 아티클 보다보니 query_string 직접 안쓰고 bool 쿼리로 말아서 등록해 놓은게 있는데 이 방법으로 시도
percolate 에서 사용할 쿼리? 저장 2
- 요청
curl --location --request PUT 'localhost:9200/nelo2-percolate/_doc/4?refresh&pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"bool": {
"must": {
"query_string": {
"query": "projectName:\"xep-test\" AND host:\"xep-local\" AND body:xep*",
"default_operator": "AND",
"analyze_wildcard": true,
"default_field": "body"
}
}
}
}
}'
- 응답
- 문서 아이디 4번으로 생성
{
"_index": "nelo2-percolate",
"_type": "_doc",
"_id": "4",
"_version": 1,
"result": "created",
"forced_refresh": true,
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 8,
"_primary_term": 1
}
등록된 문서가 잘 검색되는지 검증 (percolate API 기능 확인)
- 요청
curl --location --request GET 'localhost:9200/nelo2-percolate/_search?pretty' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"percolate": {
"field": "query",
"document": {
"body": "xephysis test",
"projectName":"xep-test",
"host":"xep-local",
"logTime": 1625624607
}
}
}
}
'
- 응답
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.2615292,
"hits": [
{
"_index": "nelo2-percolate",
"_type": "_doc",
"_id": "4",
"_score": 1.2615292,
"_source": {
"query": {
"bool": {
"must": {
"query_string": {
"query": "projectName:\"xep-test\" AND host:\"xep-local\" AND body:xep*",
"default_operator": "AND",
"analyze_wildcard": true,
"default_field": "body"
}
}
}
}
},
"fields": {
"_percolator_document_slot": [
0
]
}
}
]
}
}
결과 및 요약
- 맨위로
'개발관련 > 오픈소스(들?)' 카테고리의 다른 글
Opensearch (aws elasticsearch) (0) | 2021.08.08 |
---|---|
kafka 카프카 관리하기 (0) | 2021.07.07 |
로컬 환경에 kakfa 설치 및 구성 (0) | 2021.06.23 |
elasticsearch 의 저장 과정 (0) | 2021.05.24 |
kafka 2.8.0 (0) | 2021.05.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- jhipster
- opensearch
- AWS
- meta character
- Async
- 만들면서 배우는 클린 아키텍처
- Kafka
- Dangling
- 전설로떠나는월가의영웅
- 에픽테토스
- percolate
- completablefuture
- 기술블로그
- 기술사이트
- Java
- 말의품격
- pecs
- kafka 2.8.0
- 클린 아키텍처
- flush
- fsync
- elasticsearch
- COMMIT
- WebSocket
- Spring
- 사기꾼증후군
- 개발자
- PatternSyntaxException
- 기술센싱
- Generic
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함