2017-03-09 10 views
0

에 "일치해야합니다"I는 I 찾을 ElasticSearch 쿼리를 사용하고자하는 나의 로그에 다음과 같습니다 elasticsearch에서 하나의 "메시지"로 표현된다 위 라인의 각 이후Elasticsearch 쿼리 로그

2014-07-02 20:52:39 INFO home.helloworld: LOGGER/LOG:ID1234 has successfully been received, {"uuid"="abc123"} 
2014-07-02 20:52:39 INFO home.helloworld: LOGGER/LOG:ID1234 has successfully been transferred, {"uuid"="abc123"} 
2014-07-02 20:52:39 INFO home.byebyeworld: LOGGER/LOG:ID1234 has successfully been processed, {"uuid"="abc123"} 
2014-07-02 20:52:39 INFO home.byebyeworld: LOGGER/LOG:ID1234 has exited, {"uuid"="abc123"} 
2014-07-02 20:53:00 INFO home.helloworld: LOGGER/LOG:ID1234 has successfully been received, {"uuid"="def123"} 
2014-07-02 20:53:00 INFO home.helloworld: LOGGER/LOG:ID1234 has successfully been transferred, {"uuid"="def123"} 
2014-07-02 20:53:00 INFO home.byebyeworld: LOGGER/LOG:ID1234 has successfully been processed, {"uuid"="def123"} 
2014-07-02 20:53:00 INFO home.byebyeworld: LOGGER/LOG:ID1234 has exited, {"uuid"="def123"} 

을 , 난 POST를 나머지 호출을 사용하여 쿼리 시간이 힘들어. 난 단지 내 로그 라인 1을 얻기 위해 아래와 같이 "일치해야합니다"사용하여 시도하지만 가끔은 대신 1 개 히트의 여러 히트 반환 일치하지 않습니다 :

{ 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "must" : [ 
       { "match_phrase_prefix" : {"message" : "home.helloworld:"}}, 
       { "match_phrase_prefix" : {"message" : "LOGGER/LOG:ID1234"}}, 
       { "match" : {"message" : "received, {\"uuid\"=\"abc123\"}"}} 
       ] 
      } 
     } 
     } 
    } 
} 

내가 위의 elasticsearch 쿼리와 아무 잘못을하고있는 중이 야 ? 나는 "must"가 AND와 같고 "match"가 더 많이 포함되었다고 생각했다. "match_phrase_prefix"는 STARTSWITH인가? 누군가가 위의 로그가 다른 uuid 번호로 채워진 로그를 올바르게 쿼리하고 단일 히트 만 리턴하는 방법을 보여 주실 수 있습니까? 원래 내가 위의 쿼리를 가지고 있다고 생각했는데, 처음에는 1 개의 히트를 리턴했지만 그 다음에는 2 개를 리턴했습니다. 내게 일관성이 없습니다. 미리 감사드립니다 !!

답변

0

문제는 bool 쿼리의 3 번째 절에 있습니다. 내가 당신에게 도움이 될만한 몇 가지 질문을 드리겠습니다. 그리고 왜 그들이 그 일을하는지 설명하겠습니다.

첫 번째 쿼리는

curl -XGET http://localhost:9200/my_logs/_search -d ' 
{ 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "must" : [ 
       { "match_phrase_prefix" : {"message" : "home.helloworld:"}}, 
       { "match_phrase_prefix" : {"message" : "LOGGER/LOG:ID1234"}}, 
       { "match" : { 
        "message" : { 
         "query": "received, {\"uuid\"=\"abc123\"", 
         "operator": "and" 
        } 
        } 
       } 
       ] 
      } 
     } 
     } 
    } 
}' 

설명

의 우리가 색인에 대한 동일한 페이지에 있는지 확인합시다. 기본적으로 인덱서는 표준 분석 체인을 통해 데이터를 전달합니다. 나는. 공백 문자로 줄이거 나, 특수 문자를 줄이거나, 하위 문자를 만드는 등의 작업을 할 수 있습니다. 따라서 색인에서 우리는 그 위치로 토큰을 갖게됩니다.

Match query 전체 텍스트 쿼리는 쿼리 텍스트 "received, {\"uuid\"=\"abc123\""을 사용하며 분석도 통과합니다. 기본적으로이 분석은 공백으로 텍스트를 분할하고 특수 문자를 줄이며 lowercase 등을 만듭니다.이 분석 결과는 received, , abc123과 비슷합니다.

무엇을 match query으로 할 것인가? operator (즉, or)을 사용하여 해당 토큰을 message 필드와 결합합니다. 그래서 논리적 인 표현으로 마지막 절 (match-query)은 다음과 같습니다 : message:received OR message:uuid OR message:abc123.

이 때문에 처음 4 개의 로그 항목이 일치합니다. 나는 그것을 재현 할 수 있었다.

두 번째 쿼리

curl -XGET http://localhost:9200/my_logs/_search -d ' 
{ 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "must" : [ 
       { "match_phrase_prefix" : {"message" : "home.helloworld:"}}, 
       { "match_phrase_prefix" : {"message" : "LOGGER/LOG:ID1234"}}, 
       { "match_phrase_prefix" : {"received, {\"uuid\"=\"abc123\""}} 
       ] 
      } 
     } 
     } 
    } 
}' 

설명

이것은 조금 간단. 기억해 두어야 할 점은 색인 생성 과정에서 토큰과 인덱스의 위치가 그대로 유지된다는 것입니다.

실제로 Match Phrase Prefix 쿼리가 수행하는 작업 - 입력 쿼리 (예 : received, {\"uuid\"=\"abc123\")를 가져와 쿼리 텍스트 분석과 정확히 동일한 단계를 수행합니다.그리고 토큰을 찾으려고합니다. received, uuid, abc123, 이웃에 위치에 있습니다. 동일한 순서로 정확히 received ->uuid ->abc123 (거의).

마지막 토큰을 제외하고 여기서는 abc123입니다. 정확히 말하면 마지막 토큰에 대해 와일드 카드를 만듭니다. 나는. received ->uuid ->abc123* >uuid - ->abc123 (즉 결국 와일드 카드없이) - 실제로 Match Phrase 쿼리가하고있는 것입니다

내가 received가 추가 것 완벽합니다. 또한 색인의 위치를 ​​계산합니다. 즉 임의의 위치에있는 토큰을 분리하는 것이 아니라 '구'와 일치 시키려고 시도합니다.