ElasticSearch 구조화 조회

12477 단어 ElasticSearch
Elasticsearch는 풍부한 검색 필터 문장을 제공하지만, 일부는 우리가 비교적 자주 사용하는 것이다.지금 우리는 이 가장 자주 사용하는 검색 필터 문장들을 신속하게 소개한다.

term 필터링

term 주로 숫자, 날짜, 부울 값 또는 not_analyzed 문자열 (분석되지 않은 텍스트 데이터 유형) 과 일치하는 값에 사용됩니다.
    { "term": { "age":    26           }}
    { "term": { "date":   "2014-09-01" }}
    { "term": { "public": true         }}
    { "term": { "tag":    "full_text"  }}

terms 필터링

termsterm과 약간 유사하지만 terms여러 개의 일치 조건을 지정할 수 있습니다.필드가 여러 값을 지정하면 문서가 함께 일치해야 합니다.
{
    "terms": {
        "tag": [ "search", "full_text", "nosql" ]
        }
}

범위 필터링

range 필터링을 통해 지정된 범위에 따라 데이터를 찾을 수 있습니다.
{
    "range": {
        "age": {
            "gte":  20,
            "lt":   30
        }
    }
}

범위 연산자는 다음과 같습니다.gt: 보다 크다gte: 보다 크면 같음lt: 이하lte: 이하

exists와missing 필터

existsmissing 필터링은 문서에 지정된 필드가 포함되어 있는지 또는 SQL 문장의 IS_NULL 조건과 유사한 필드가 없는지를 찾는 데 사용됩니다.
{
    "exists":   {
        "field":    "title"
    }
}

이 두 필터는 이미 찾아낸 데이터에 대한 것이지만, 어떤 필드가 존재하는지 구분하고 싶을 때 사용됩니다.

bool 필터링

bool 필터는 여러 필터 조건 조회 결과를 병합하는 데 사용할 수 있는 부울 논리로 조작부호를 포함합니다.must: 여러 개의 조회 조건이 완전히 일치하여 and에 해당한다.must_not: 여러 개의 조회 조건의 상반된 일치는 not에 해당한다.should: 최소한 하나의 조회 조건이 일치합니다. or에 해당합니다.
이러한 매개변수는 필터 조건 또는 필터 조건의 배열을 각각 상속할 수 있습니다.
{
    "bool": {
        "must":     { "term": { "folder": "inbox" }},
        "must_not": { "term": { "tag":    "spam"  }},
        "should": [
                    { "term": { "starred": true   }},
                    { "term": { "unread":  true   }}
        ]
    }
}

match_all 조회

match_all를 사용하면 모든 문서를 조회할 수 있으며 조회 조건이 없는 기본 문장입니다.
{
    "match_all": {}
}

이 조회는 필터 조건을 병합하는 데 자주 사용됩니다.예를 들어 모든 메일박스를 검색해야 하는데 모든 문서의 관련성이 같기 때문에 얻은 것_score은 1이다

match 질의

match 조회는 표준 조회입니다. 전체 텍스트 조회가 필요하든 정확한 조회가 필요하든 기본적으로 그것을 사용해야 합니다.
만약 match를 사용하여 전체 텍스트 필드를 조회한다면, 진정한 조회를 하기 전에 분석기로 match 조회 문자를 분석합니다.
{
    "match": {
        "tweet": "About Search"
    }
}
match 로 정확한 값을 지정하면 숫자, 날짜, 부울 값 또는 not_analyzed 문자열을 만났을 때 지정한 값을 검색합니다.
{ "match": { "age":    26           }}
{ "match": { "date":   "2014-09-01" }}
{ "match": { "public": true         }}
{ "match": { "tag":    "full_text"  }}

알림: 정확한 일치 검색을 할 때, 필터 문장을 사용하는 것이 좋습니다. 필터 문장은 데이터를 캐시할 수 있기 때문입니다.
우리가 에서 소개한 문자 검색과 달리 match 검색은 "+usid:2+tweet:search"와 같은 문장을 사용할 수 없습니다.문법 오류를 피하기 위해 정확한 필드 이름만 지정할 수 있습니다.

multi_match 질의

multi_match 조회는 match 조회를 바탕으로 여러 필드를 동시에 검색할 수 있습니다.
{
    "multi_match": {
        "query":    "full text search",
        "fields":   [ "title", "body" ]
    }
}

bool 조회

bool 조회는 bool 필터와 비슷하여 여러 개의 조회 자구를 통합하는 데 사용됩니다.다른 것은 bool 필터는 일치 여부를 직접 제시할 수 있고, bool 조회는 모든 조회 자구의 _score (관련성 점수) 를 계산해야 한다.must: 지정한 문서를 조회하려면 반드시 포함해야 합니다.must_not: 지정한 문서를 조회할 때 반드시 포함하지 마십시오.should: 지정한 문서를 조회하고 있으면 문서 관련성에 점수를 부여할 수 있습니다.
다음 검색에서는 title 필드에'how to make millions'가 포함되어 있고'tag'필드가 spam 로 표시되지 않았습니다.만약에'starred'라고 표시되거나 발표일이 2014년 이전이라면 이 일치하는 문서들은 같은 사이트보다 등급이 높을 것이다.
{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }},
            { "range": { "date": { "gte": "2014-01-01" }}}
        ]
    }
}

알림: bool 조회에 must 자구가 없으면 최소한 should 자구가 있어야 합니다.그러나 must 자구가 있으면 should 자구가 없어도 조회할 수 있다.

조회와 필터 조건의 합병


조회 문장과 필터 문장은 각자의 상하문에 놓을 수 있다.ElasticSearch API에서는 query 또는 filter 가 포함된 많은 구문을 볼 수 있습니다.이 문장들은 하나의query문장도 포함할 수 있고,filter자구도 포함할 수 있다.다시 말하면 이 문장들은 먼저 query 또는 filter 상하문 관계를 만들어야 한다.
복합 검색 문장은 다른 검색 서브문장을 넣을 수 있고, 복합 필터 문장도 다른 필터 서브문장을 넣을 수 있다.일반적인 경우, 검색 문장은 전체 텍스트 검색을 제외하고, 필터 문장의 보조를 필요로 한다.
그러니까 검색 문장은 필터 자구를 포함할 수 있고, 반대로도 마찬가지다.query나 filter의 상하문을 전환할 수 있도록 합니다.이것은 우리가 수요를 읽는 동시에 정확하고 효과적인 문장을 구성하도록 요구한다.

필터가 있는 조회 문장


검색 문장 필터링


예를 들어 우리는 이런 조회 문장이 있다.
{
    "match": {
        "email": "business opportunity"
    }
}

그리고 우리는 이 문장을 term 필터에 넣고 우편함에 메일을 일치하게 하려고 합니다.
{
    "term": {
        "folder": "inbox"
    }
}
search API에는 query 문장만 포함할 수 있으므로 filtered 를 사용하여 "query"와 "filter"자문을 동시에 포함해야 합니다.
{
    "filtered": {
        "query":  { "match": { "email": "business opportunity" }},
        "filter": { "term":  { "folder": "inbox" }}
    }
}

우리는 외부에서 query 컨텍스트 관계를 추가합니다.
GET /_search
{
    "query": {
        "filtered": {
            "query":  { "match": { "email": "business opportunity" }},
            "filter": { "term": { "folder": "inbox" }}
        }
    }
}

단일 필터 문

query 상하문에서 필터 문장만 있으면 됩니다. 예를 들어 모든 메일과 일치할 때 query 자구를 생략할 수 있습니다.
GET /_search
{
    "query": {
        "filtered": {
            "filter":   { "term": { "folder": "inbox" }}
        }
    }
}

만약 조회 문장이 조회 범위를 지정하지 않았다면, 기본적으로 match_all 조회를 사용하기 때문에, 위 문장의 완전한 형식은 다음과 같다.
GET /_search
{
    "query": {
        "filtered": {
            "query":    { "match_all": {}},
            "filter":   { "term": { "folder": "inbox" }}
        }
    }
}

검색 문장의 필터


때때로, 필터의 상하문에서query 자구를 사용해야 합니다.다음 문장은 검색 기능이 있는 필터 문장입니다. 이 문장은 스팸메일처럼 보이는 문서를 필터할 수 있습니다.
GET /_search
{
    "query": {
        "filtered": {
            "filter":   {
                "bool": {
                    "must":     { "term":  { "folder": "inbox" }},
                    "must_not": {
                        "query": { <1>
                            "match": { "email": "urgent business proposal" }
                        }
                    }
                }
            }
        }
    }
}

<1> 필터 문장에서 query 검색 방식으로 bool 필터 자문을 대체할 수 있습니다.
힌트: 우리가 거의 사용하지 않는 필터 문장에는 검색이 포함되어 있으며, 이러한 사용법은 문법의 완전성을 위한 것이다.필터에서 전체 텍스트가 일치할 때만 이 구조를 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기