ElasticSearch Query 사용하기
보통 es 에서 query 사용해야 할 때 아래와 같은 식으로 쉘을 짜서 돌리곤 한다.
1 #!/bin/sh
2
3 echo "curl -XPOST sgmm:9200/others_201307/_search?pretty=true -d ' {
4 \"fields\" : [ \"*\" ],
5 \"query\": {
6 \"query_string\" : {
7 \"query\" : \"USERID:aa..bb.cc AND CTIME:[20130723000000 TO 20130723235959] \"
8 }
9 },
10 \"size\" : 100,
11 \"sort\" : { \"MSGID\" : \"asc\" }}'" > tmp.sh
12
13
14
15 sh tmp.sh > result.log
16
그러나 USERID 필드를 이용해 쿼리를 날리려고 하니 문제가 발생했다.
USERID 가 analyzed 되어 있어 위의 필드 값으로 검색하려니 정상적으로 검색되지 않는 것
. (dot) 기호를 정상인식 못하고 aa bb cc 를 토큰화 시켜 검색하는 것 같다.
급한대로 동일 필드에서 analyzed 되어 있지 않은 SSNO 필드를 사용하여 원하는 결과를 뽑아내긴 했다.
하지만 ES 에서 DOT 을 사용해서 검색할 수 있는 쿼리 구조를 고민해봐야 겠다.
[ 해결책 ]
위 스크립트는 불필요한 \ 를 잔뜩 삽입해놓고 결국엔 tmp.sh 을 실행한다.
어중간한 문법은 정리하고 .(dot) 은 쌍따옴표로 감싸주자.
이때 쌍따옴표는 \ 로 구분해줘야 한다.
1 #!/bin/bash
2
3 curl -XPOST sgmm:9200/others_201307/_search?pretty=true -d ' {
4 "fields" : [ "*" ],
5 "query": {
6 "query_string" : {
7 "query" : "USERID:\"aa.bb.cc\" AND CTIME:[20130723000000 TO 20130723235959] "
8 }
9 },
10 "size" : 100,
11 "sort" : { "MSGID" : "asc" }}'