Elasticsearch Query DSL 검색 입문

14499 단어
DSL 을 공부 하기 위 한 노트 입 니 다. ES 초보 자 에 게 적합 합 니 다. 큰 놈 은 생략 하 세 요 ~
Query DSL 은 조회 표현 식 이 라 고도 부 르 는데 매우 유연 하고 표 현 력 이 있 는 조회 언어 로 JSON 인터페이스 방식 으로 풍부 한 조 회 를 실현 하고 조회 문 구 를 더욱 유연 하고 정확 하 며 읽 기 쉽 고 디 버 깅 하기 쉽 습 니 다.
검색 및 필터
Elasticsearch (이하 ES 로 약칭) 의 데이터 검색 은 두 가지 상황 으로 나 뉜 다. 조회 와 여과 이다.
Query 조 회 는 검색 결 과 를 평가 하고 일치 하 는 정 도 를 중시 합 니 다. 예 를 들 어 '커피 를 운반 합 시다' 를 검색 하면 문서 의 제목 과 얼마나 일치 하 는 지, 조회 와 문서 의 관련 정 도 를 계산 합 니 다. 계산 이 끝 난 후에 평 점 을 계산 하여 _score 필드 에 기록 하고 최종 적 으로 _score 필드 에 따라 검색 한 모든 문 서 를 정렬 합 니 다.
필터 필 터 는 검색 결 과 를 평가 하지 않 습 니 다. 중요 한 것 은 일치 하 는 지 여부 입 니 다. 예 를 들 어 '커피 를 운반 하 세 요' 가 문서 의 제목 과 일치 하 는 지 검색 한 결과 만 일치 하거나 일치 하지 않 습 니 다. 결과 만 간단하게 일치 하기 때문에 계산 도 매우 빠 르 고 필터 결 과 는 메모리 에 캐 시 되 어 Query 조회 보다 성능 이 훨씬 높 습 니 다.
단순 조회
가장 간단 한 DSL 조회 표현 식 은 다음 과 같 습 니 다.
GET /_search
{
  "query":{
    "match_all": {}
  }
}

/_search 전체 ES 의 모든 색인 내용 찾기
query 는 검색 키 입 니 다. 유사 한 것 은 aggs 취 합 키워드 입 니 다.
match_all 모든 문서 와 일치 하 며, match_none 문서 와 일치 하지 않 습 니 다.
결과 되 돌리 기:
{
  "took": 6729,
  "timed_out": false,
  "num_reduce_phases": 6,
  "_shards": {
    "total": 2611,
    "successful": 2611,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 7662397664,
    "max_score": 1,
    "hits": [
      {
        "_index": ".kibana",
        "_type": "doc",
        "_id": "url:ec540365d822e8955cf2fa085db189c2",
        "_score": 1,
        "_source": {
          "type": "url",
          "updated_at": "2018-05-09T07:19:46.075Z",
          "url": {
            "url": "/app/kibana",
            "accessCount": 0,
            "createDate": "2018-05-09T07:19:46.075Z",
            "accessDate": "2018-05-09T07:19:46.075Z"
          }
        }
      },
	  ...       ...
    ]
  }
}

took: 전체 검색 요청 을 수행 하 는 데 몇 밀리초 가 소 모 됐 는 지 표시 합 니 다.
timed_out: 이번 조회 시간 초과 여부 표시timed_out 이 True 일 때 도 결 과 를 되 돌려 줍 니 다. 이 결 과 는 시간 초과 요청 시 ES 에서 얻 은 데이터 이기 때문에 되 돌아 오 는 데이터 가 완전 하지 않 을 수 있 습 니 다.
그리고 트 루 timed_out 를 받 은 후에 이 연결 이 닫 혔 지만 배경 에서 이 조 회 는 끝나 지 않 고 계속 실 행 될 것 입 니 다.
_shards: 검색 에 참여 한 블록 버스터 정보, 성공 한 블록 버스터 실패 한 블록 버스터 등 을 표시 합 니 다.
hits: 일치 하 는 문서 의 정 보 를 표시 합 니 다. 그 중에서 total 일치 하 는 문서 의 총 수 를 표시 합 니 다. max_score 는 문서 의 모든 _score 의 최대 값 입 니 다.
hits 의 hits 배열 은 조회 한 문서 결 과 를 기본 으로 조회 결 과 를 포함 하 는 10 개의 문 서 를 포함 하고 모든 문서 에는 문서 _index, _type, _id, _score_source 데이터 가 포함 되 어 있 습 니 다.
결과 문 서 는 기본적으로 사진 관련 도 ( score) 에 따라 내림차 순 으로 배열 되 어 있 습 니 다. 즉, 가장 먼저 관련 도가 높 은 문 서 를 되 돌려 주 는 것 입 니 다. 문서 관련 도 는 문서 내용 과 조회 조건 의 일치 정도, 위의 조회 와 여과 에 소개 되 어 있 습 니 다.
지정 색인
위의 검색 은 ES 의 모든 색인 을 검색 합 니 다. 그러나 우 리 는 보통 한 개 또는 몇 개의 색인 에서 검색 하면 됩 니 다. 검색 은 모두 자원 의 낭 비 를 초래 할 수 있 습 니 다. ES 에서 다음 과 같은 몇 가지 방법 으로 색인 을 지정 할 수 있 습 니 다.
  • 고정된 색인 을 지정 합 니 다. ops-coffee-nginx-2019.05.15 색인 이름
  • GET /ops-coffee-nginx-2019.05.15/_search
    

    이상 은 ops-coffee-nginx-2019.05.15 색인 에서 데 이 터 를 찾 는 것 을 나타 낸다.
  • 여러 개의 고정 색인 을 지정 하고 여러 개의 색인 이름 을 쉼표 로 분할 합 니 다
  • GET /ops-coffee-nginx-2019.05.15,ops-coffee-nginx-2019.05.14/_search
    
  • * 번 으로 일치 하 며 일치 하 는 모든 색인 에서 데 이 터 를 찾 습 니 다
  • GET /ops-coffee-nginx-*/_search
    

    물론 여기 도 쉼표 로 여러 개의 일치 색인 을 나 눌 수 있다.
    페이지 별 조회
    위 에서 조회 결과 hits 는 기본적으로 10 개의 문서 만 보 여 준다 고 했 는데 10 개의 이후 문 서 를 어떻게 조회 합 니까?ES 에서 sizefrom 두 개의 인 자 를 주 었 다.
    size: 되 돌아 오 는 결과 수량, 즉 hits 의 문서 수량 을 설정 합 니 다. 기본 값 은 10 입 니 다.
    from: 몇 번 째 결과 부터 뒤로 조회 하도록 설정 합 니 다. 기본 값 은 0 입 니 다.
    GET /ops-coffee-nginx-2019.05.15/_search
    {
      "size": 5,
      "from": 10,
      "query":{
        "match_all": {}
      }
    }
    

    이상 의 조 회 는 조회 ops-coffee-nginx-2019.05.15 색인 에 있 는 모든 데 이 터 를 표시 하고 hits 에 11 번 째 부터 15 번 째 문서 의 데 이 터 를 표시 합 니 다.
    전체 텍스트 조회
    위 에는 하나의 match_all 전문 조회 키워드 가 있 습 니 다. match_all 모든 기록 을 조회 하기 위해 자주 사용 하 는 조회 키 워드 는 ES 에 다음 과 같은 몇 가지 가 있 습 니 다.
    match
    가장 간단 한 조회, 아래 의 예 는 찾기 hostops-coffee.cn 인 모든 기록 을 나타 낸다.
    GET /ops-coffee-2019.05.15/_search
    {
      "query":{
        "match": {
          "host":"ops-coffee.cn"
        }
      }
    }
    

    multi_match
    여러 필드 에서 같은 match 조 회 를 실행 하고 아래 의 예 는 조회 host 또는 http_referer 필드 에 포 함 된 기록 을 나타 낸다.
    GET /ops-coffee-2019.05.15/_search
    {
      "query":{
        "multi_match": {
          "query":"ops-coffee.cn",
          "fields":["host","http_referer"]
        }
      }
    }
    

    query_string
    검색 에서 AND 또는 OR 를 사용 하여 복잡 한 검색 을 완성 할 수 있 습 니 다. 예 를 들 어:
    GET /ops-coffee-2019.05.15/_search
    {
      "query":{
        "query_string": {
          "query":"(a.ops-coffee.cn) OR (b.ops-coffee.cn)",
          "fields":["host"]
        }
      }
    }
    

    이상 은 host 가 ops-coffee.cn 또는 a.ops-coffee.cn 인 모든 기록 을 찾 는 것 을 나타 낸다.
    아래 의 이런 방식 으로 더 많은 조건 을 조합 하여 더욱 복잡 한 조회 요 구 를 완성 할 수 있다.
    GET /ops-coffee-2019.05.14/_search
    {
      "query":{
        "query_string": {
          "query":"host:a.ops-coffee.cn OR (host:b.ops-coffee.cn AND status:403)"
        }
      }
    }
    

    이상 은 조회 (host 는 b.ops-coffee.cn 또는 (host 는 a.ops-coffee.cn 이 고 status 는 403) 의 모든 기록 을 나타 낸다.
    비슷 한 것 보 다 는 simplequery_string 키 워드 는 b.ops-coffee.cn 의 AND 또는 OR 를 query_string 또는 + 와 같은 기호 로 대체 할 수 있 습 니 다.
    term
    term 는 정확하게 일치 할 수 있 습 니 다. 정확하게 일치 하 는 값 은 숫자, 시간, 불 값 또는 | 단 어 를 가리 지 않 는 문자열 을 설정 할 수 있 습 니 다.
    GET /ops-coffee-2019.05.14/_search
    {
      "query":{
        "term": {
          "status": {
            "value": 404
          }
        }
      }
    }
    

    term 입력 한 텍스트 를 분석 하지 않 고 출력 결과 와 직접 정확하게 일치 합 니 다. 여러 값 을 동시에 일치 하려 면 terms 를 사용 할 수 있 습 니 다.
    GET /ops-coffee-2019.05.14/_search
    {
      "query": {
        "terms": {
          "status":[403,404]
        }
      }
    }
    

    range
    range 는 지정 한 구간 에 떨 어 진 숫자 나 시간 을 조회 하 는 데 사 용 됩 니 다.
    GET /ops-coffee-2019.05.14/_search
    {
      "query": {
        "range":{
          "status":{
            "gte": 400,
            "lte": 599
          }
        }
      }
    }
    

    이상 은 모든 상태 가 400 에서 599 사이 의 데 이 터 를 검색 하 는 것 을 나타 낸다. 이곳 의 조작 부 호 는 주로 네 개 not_analyzed 가 크 고 gt 가 같 으 며 gte 보다 작 으 며 lt 보다 작다.
    날 짜 를 범위 로 조회 할 때, 우 리 는 다음 날짜 의 형식 에 주의해 야 한다. 공식 적 으로 지원 하 는 날짜 형식 은 주로 두 가지 가 있다.
  • 타임 스탬프, 밀리초 입도
  • 주의
    GET /ops-coffee-2019.05.14/_search
    {
      "query": {
        "range": {
          "@timestamp": {
            "gte": 1557676800000,
            "lte": 1557680400000,
            "format":"epoch_millis"
          }
        }
      }
    }
    
  • 날짜 문자열
  • GET /ops-coffee-2019.05.14/_search
    {
      "query": {
        "range":{
          "@timestamp":{
            "gte": "2019-05-13 18:30:00",
            "lte": "2019-05-14",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd",
            "time_zone": "+08:00"
          }
        }
      }
    }
    

    보통 이런 날짜 문자열 을 사용 하 는 것 을 추천 합 니 다. 뚜렷 해 보이 고 날짜 형식 은 자신의 습관 에 따라 입력 할 수 있 습 니 다. lte 필드 에서 일치 하 는 형식 만 지정 하면 형식 이 여러 개 있 으 면 format 으로 나 눌 수 있 습 니 다. 예 를 들 어 저 는 같은 날짜 형식 을 사용 하 는 것 을 추천 합 니 다.
    날짜 에 연월 일이 없 으 면 부족 한 부분 은 유 닉 스 의 시작 시간 (즉 1970 년 1 월 1 일) 으로 채 워 집 니 다. || 을 형식 으로 지정 하면 "format":"dd""gte":10 으로 전 환 됩 니 다.
    elasticsearch 에 서 는 기본적으로 UTC 시간 을 사용 하기 때문에 오류 가 발생 하지 않도록 사용 할 때 1970-01-10T00:00:00.000Z 시간 대 를 설정 해 야 합 니 다.
    조합 조회
    일반적으로 우 리 는 여러 가지 조건 을 조합 하여 최후 의 결 과 를 찾 아야 할 수도 있다. 이 럴 때 ES 가 제공 하 는 time_zone 을 사용 하여 실현 해 야 한다.
    예 를 들 어 우리 가 조회 boolhost 이 고 ops-coffee.cnhttp_x_forworded_for 이 며 111.18.78.128 200 이 아 닌 모든 데 이 터 는 아래 의 문 구 를 사용 할 수 있다.
    GET /ops-coffee-2019.05.14/_search
    {
     "query":{
        "bool": {
          "filter": [
            {"match": {
              "host": "ops-coffee.cn"
            }},
            {"match": {
              "http_x_forwarded_for": "111.18.78.128"
            }}
          ],
          "must_not": {
            "match": {
              "status": 200
            }
          }
        }
      }
    }
    

    주로 네 개의 키 워드 를 조합 하여 조회 간 의 관 계 를 조회 하 는데 그것 이 바로 다음 과 같다.
    must: SQL 의 AND 와 유사 합 니 다. 포함 되 어야 합 니 다.
    must_not: SQL 의 NOT 와 유사 합 니 다. 포함 되 지 않 아야 합 니 다.
    should: 이러한 조건 을 만족 시 키 는 모든 조건 은 평 점 status 을 증가 시 키 고 만족 하지 않 아 도 영향 을 주지 않 습 니 다. _score 조회 결과 의 should 값 에 만 영향 을 주 고 결과 의 내용 에 영향 을 주지 않 습 니 다.
    filter: must 와 비슷 하지만 결과 에 대해 상관 성 평 가 를 하지 않 습 니 다 _score. 대부분의 경우 로그 에 대한 수요 가 상관 성 이 없 기 때문에 조회 과정 에서 filter 를 많이 사용 하 는 것 을 권장 합 니 다.
    마지막 에 쓰다
    ES 의 조 회 는 넓 고 심오 하 며 본 글 은 기초 입문 에 속 하 며 내용 은 홈 페이지 에서 기원 된다.
    인터넷 에 서 는 ELK 구축 배치 로 그 를 수집 하 는 글 이 많 지만 로 그 를 수집 한 후 이 데이터 보 고 를 어떻게 활용 해 야 합 니까?인터넷 에서 일부 큰 공장 에서 공유 하 는 비교적 광범 위 한 개념 만 실제 적 으로 정착 하 는 과정 이 없습니다. 저 는 이런 데 이 터 를 이용 하고 싶 습 니 다. 초보적인 생각 은 ES 에 가서 업무 나 기능 의 데이터 데 이 터 를 검색 한 다음 에 트 렌 드 분석 을 하 는 것 입 니 다. 이것 은 DSL 부터 공부 하지 않 습 니 다. 여러분 과 제 친구 들 이 저 를 찾 아와 교 류 를 하 는 것 을 환영 합 니 다. 저 는 매우 기 쁘 겠 습 니 다.
    관련 글 추천 읽 기:
  • ELK 구축 MySQL 슬 로 우 로그 수집 플랫폼 상세 설명
  • ELK 로그 시스템 에서 Rsyslog 를 사용 하여 Nginx 로 그 를 빠 르 고 편리 하 게 수집
  • ELK 로그 시스템 의 유 니 버 설 응용 프로그램 로그 접속 방안
  • Logstash 가 Kafka 데 이 터 를 읽 고 HDFS 에 기록 하 는 상세 한 설명
  • Filebeat 의 Registry 파일 해독
  • 다음으로 전송:https://juejin.im/post/5cdded58e51d4515b4778117

    좋은 웹페이지 즐겨찾기