Elasticsearch DSL 질의 상세 정보
DSL 쿼리는 JSON 형식의 요청체와 Elasticsearch를 사용하여 다양한 쿼리 요구를 실현할 수 있습니다.
DSL 질의에는 다음과 같은 두 가지 유형의 질의 문구가 포함됩니다.
쿼리 문장의 실행 결과는 쿼리 언어에 사용될 것인지, 필터 언어에 사용될 것인지에 의존한다.
기본 문법
DSL 쿼리를 사용하려면 query 매개 변수를 사용해야 합니다.
기본 구문 형식:
GET /_search
{
"query":
}
빈 질의
조회 조건이 없는 조회는 빈 조회입니다.모든 문서와 일치합니다.
GET /_search
{
"query": {}
}
... 과 같다
GET /_search
... 과 같다
GET /_search
{
"query": {
"match_all": {}
}
}
기본 조회
예를 들어, match 쿼리를 사용하여 full_name 필드에john 기록이 포함되어 있습니다.
GET /_search
{
"query": {
"match": {
"full_name": "john"
}
}
}
조회 및 필터링
DSL 질의는 사용 목적에 따라 두 가지 유형으로 나뉩니다.
쿼리(Query)
컨텍스트 질의 환경에서 질의 문장은 문서와 질의 문장의 일치 정도를 묻고, 문서의 일치 여부를 판단하고 관련성 평점 (_score) 의 값을 계산합니다.
필터(Filter)
상하문 필터 언어 환경에서 조회 문장은 주로 문서의 일치 여부를 해결하고 일치 정도(관련성 평점)에 신경 쓰지 않는다.필터는 주로 구조화된 데이터에 쓰인다.
예:
status 필드의 값은 어떤 매거 값이나 볼 값입니까?
age 필드의 값은 20-35 범위 내에 있습니까?
date 필드의 값은 2016-2019 사이입니까?
일반적으로 필터 문장은 조회 문장보다 실행 효율이 높다. 왜냐하면 문서의 관련성 평점 (score) 을 계산하지 않기 때문이다.
잦은 필터 문구를 사용한 결과 집합은 Elasticsearch에 의해 자동으로 캐시되어 성능을 향상시킵니다.
필터의 목적은 일치하는 결과집을 난폭하게 빠르게 축소하는 것이다.
일반적으로 전체 텍스트 검색이나 관련성 평점 (score) 을 사용해야 하는 장면은 검색 (query) 을 사용하고 다른 것은 모두 필터 (filter) 를 사용합니다.
검색을 할 때, 우리는 종종 검색 문장에서 검색과 필터를 결합하여 우리의 검색 목적을 달성한다.
다음은 예입니다.
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
전체 텍스트 조회
전체 텍스트 검색 문장은 일반적으로 전체 텍스트 필드의 검색에 사용됩니다.
match
match 조회는 텍스트, 수치, 날짜 유형의 데이터를 조작하여 분석하고 조회 문장을 구축할 수 있습니다.
예: 쿼리 full_name 필드에 John 또는 Smith 문서가 들어 있습니다.
GET /_search
{
"query" : {
"match" : {
"full_name" : "John Smith"
}
}
}
설명: Elasticsearch는 먼저 분석기를 사용하여 "John Smith"를 두 개의 독립된 항목인 "John"과 "Smith"로 분석한 다음에 조회를 구축합니다.
여기 full_name 필드는 검색하고 싶은 필드로 바꿀 수 있습니다. 심지어는_all 필드.
match는 boolean의 유형에 속한다. 즉, 분석기는 제공하는 검색 텍스트를 분석하고 boolean 검색 문장을 구축한다.
match에서 구축된boolean 검색 문장의 기본값은 논리 또는 (or)입니다. 물론,operator 매개 변수를 통해 이 기본 행동을 바꿀 수 있습니다.
예: 쿼리 full_name 필드에는 John 및 Smith 문서가 들어 있습니다.
GET /_search
{
"query": {
"match" : {
"full_name" : {
"query" : "John Smith",
"operator" : "and"
}
}
}
}
설명: full_name는 필드 이름이고query 매개 변수의 값은 검색 텍스트를 제공하며,operator 매개 변수는 match의 논리 (or 또는 and) 를 설정하는 데 사용됩니다.
match_phrase
match_phrase, 즉 단어 (어구) 가 일치합니다. 이것은 제공된 검색 텍스트를 분석하고 phrase 검색을 구축합니다.
match_phrase는 정확한 phase 일치에 사용됩니다.
예: 쿼리 full_name 필드에 "John Smith"구문이 포함된 문서입니다.
GET /_search
{
"query" : {
"match_phrase" : {
"full_name" : "John Smith"
}
}
}
또한 제공된 검색 텍스트에 analyzer (분석기) 를 지정할 수 있습니다. 지정되지 않으면 필드의 현식 맵핑에 대한 정의나 기본적인search analyzer를 사용합니다.
GET /_search
{
"query": {
"match_phrase" : {
"full_name" : {
"query" : "John Smith",
"analyzer" : "standard"
}
}
}
}
match_phrase_prefix
match_phrase_prefix 및 match_phrase 유사하지만 match_phrase_prefix는 정확한 일치가 아니라 접두사 일치입니다. 텍스트의 마지막 문자를 조회한 후의 내용을 어댑터로 검색합니다.
예: 쿼리 full_name 필드에서 "John Smi"구문으로 시작하는 문서입니다.
GET /_search
{
"query" : {
"match_phrase_prefix" : {
"full_name" : "John Smi"
}
}
}
multi_match
multi_match는 여러 필드가 일치하는 조회에 사용됩니다.
GET /_search
{
"query" : {
"multi_match": {
"query": "John Smith",
"fields": ["first_name", "full_name"]
}
}
}
Term-level 쿼리
우리는 전문 조회가 조회를 실행하기 전에 제공된 조회 텍스트를 먼저 분석한다는 것을 안다.
그러나 Term-level 조회는 역렬 인덱스의 정확한 값을 직접 조회합니다.
Term-level 조회는 일반적으로 텍스트(text)가 아닌 수치, 날짜, 열거 값, 키워드 등 구조화된 데이터에 사용됩니다.
term
term은 지정한 필드를 조회하는 데 사용되는 역렬 인덱스에 정확한 값을 포함하는 기록을 포함합니다.
POST /_search
{
"query": {
"term" : { "first_name" : "john" }
}
}
terms
terms는term과 유사하지만 정확한 값은 그룹입니다.ySQL과 유사한 in 조건입니다.
POST /_search
{
"query": {
"terms" : { "full_name" : ["john", "john2"] }
}
}
POST /_search
{
"query": {
"constant_score": {
"filter": { "terms" : { "full_name" : ["john", "john2"] }}
}
}
}
range
범위 조회에 사용됩니다.
GET /_search
{
"query": {
"range" : {
"info.age" : {
"gte" : 28,
"lt" : 60,
"boost" : 2.0
}
}
}
}
설명: boost 매개 변수는 관련성 평점 (score) 의 값을 조정하는 데 사용할 수 있습니다.
GET /_search
{
"query": {
"range" : {
"date" : {
"gt" : "now-3d/d",
"lt" : "now"
}
}
}
}
exists
exists 반환 필드 값은null의 기록이 아닙니다.
GET /_search
{
"query": {
"exists" : { "field" : "user" }
}
}
prefix
prefix는 필드의term을 되돌려줍니다. 정확한 접두사 (접두사는 분석되지 않습니다) 로 시작하는 기록입니다.
GET /_search
{
"query": {
"prefix" : { "full_name" : "joh" }
}
}
wildcard
wildcard는 어댑터 조회를 가리킨다.
지원되는 와일드카드는 다음과 같습니다.
GET /_search
{
"query": {
"wildcard" : { "full_name" : "john*" }
}
}
regexp
regexp는 정규 조회를 가리킨다.
GET /_search
{
"query": {
"regexp" : { "full_name" : "jo.*" }
}
}
fuzzy
fuzzy는 용차 조회를 가리킨다. 즉, 정확한 값과 역렬 인덱스의term 사이에 오차가 있는 것을 용인할 수 있다.
GET /_search
{
"query": {
"fuzzy" : { "full_name" : "joh" }
}
}
GET /_search
{
"query": {
"fuzzy" : {
"full_name" : {
"value" : "joh",
"fuzziness" : 2,
"prefix_length" : 0,
"max_expansions": 100
}
}
}
}
type
type 조회는 문서의 type에 따라 조회하는 것을 가리킨다.
이 type은 MySQL과 유사한 데이터 테이블을 가진 문서의 범주(논리적 그룹)입니다.
GET /_search
{
"query": {
"type" : {
"value" : "user"
}
}
}
ids
ids 조회는 문서의 id에 따라 조회하는 것을 가리킨다.
GET _search
{
"query": {
"ids" : { "values" : ["1", "2", "60"] }
}
}
복합 조회
constant_score
constant_score 복합 조회는 필터 상하문에서 조회 문장만 실행하고 되돌아오는 모든 기록의_score 값은 상수입니다.
GET /_search
{
"query": {
"constant_score" : {
"filter" : {
"term" : { "full_name" : "john"}
},
"boost" : 1.5
}
}
}
bool
bool 복합 조회는 잎 조회 문장이나 복합 조회 문장을 조합하는 데 사용됩니다.예: must,should,must_not, or filter.
설명:must와should는 조회 상하문에서 실행됩니다.must_not와 filter는 필터 상하문에서 실행됩니다.
POST /_search
{
"query": {
"bool" : {
"must" : {
"term" : { "last_name" : "smith" }
},
"filter": {
"term" : { "info.interests" : "musics" }
},
"must_not" : {
"range" : {
"info.age" : { "gte" : 10, "lte" : 25 }
}
},
"should" : [
{ "term" : { "full_name" : "john" } },
{ "term" : { "full_name" : "smith" } }
],
"minimum_should_match" : 1,
"boost" : 2.0
}
}
}
참고 문헌
[1] https://www.elastic.co/guide/en/elasticsearch/reference/5.2/index.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Elasticsearch 베이스 04 - 매핑된 작업버전 정보 버전 Elasticsearch 버전 JAVA 의존 버전 Elasticsearch 7.x는 이전 버전과 상당히 큰 변화가 있기 때문에 본 편의 내용, 특히 JAVA 코드의 조작은 이전 버전을 사용하는 학우들...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.