Elasticsearch Query DSL 검색 입문
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 에서 size
과 from
두 개의 인 자 를 주 었 다.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
가장 간단 한 조회, 아래 의 예 는 찾기
host
가 ops-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
을 사용 하여 실현 해 야 한다.예 를 들 어 우리 가 조회
bool
는 host
이 고 ops-coffee.cn
는 http_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 부터 공부 하지 않 습 니 다. 여러분 과 제 친구 들 이 저 를 찾 아와 교 류 를 하 는 것 을 환영 합 니 다. 저 는 매우 기 쁘 겠 습 니 다.
관련 글 추천 읽 기:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.