데이터베이스/Elasticsearch

Elasticsearch에서 Full text queries와 Term level queries 정리

반응형

Elasticsearch를 사용하다보면 term과 match 관련된 쿼리에 대해 헷갈리는 경우가 많다. Document에 있는 내용을 가져와서 정리해보자.


Full text queries

The high-level full text queries are usually used for running full text queries on full text fields like the body of an email. They understand how the field being queried is analyzed and will apply each field’sanalyzer (or search_analyzer) to the query string before executing.


match query

The standard query for performing full text queries, including fuzzy matching and phrase or proximity queries.

-> 전체 텍스트 쿼리를 수행하기 위한 기본 쿼리 (fuzzy 매치와 phrase, 근접 쿼리를 포함). 쉽게 말해 전체 텍스트에서 특정 부분이 포함되는지 여부를 확인하는데 fuzzy를 이용하여 유사도가 어느정도 되는 쿼리들도 조회 가능


match_phrase query

Like the match query but used for matching exact phrases or word proximity matches.

-> match와 같지만 정확한 구문이나 근접하게 매치되는 단어를 찾기위해 사용되는 쿼리


match_phrase_prefix query

The poor man’s search-as-you-type. Like the match_phrase query, but does a wildcard search on the final word.

-> match_phrase와 유사하지만 마지막 단어에서 와일드카드 사용됨. (자동완성 기능에서 자주 실행 됨)


multi_match query

The multi-field version of the match query.

-> match 쿼리의 다중 필드 버전


common terms query

A more specialized query which gives more preference to uncommon words.

-> Documentd에서 자주 발생되는 단어를 제외하고 진짜 의미있는 단어만 검색하기 위해서 사용될 때 사용하는 쿼리

-> cutoff_frequency 옵션을 사용해서 0.1%보다 빈도수가 많은 단어는 제외하고 검색하라고 할 수 있다.

"query": { "common": { "body": { "query": "this is bonsai cool", "cutoff_frequency": 0.001 } } }


query_string query

Supports the compact Lucene query string syntax, allowing you to specify AND|OR|NOT conditions and multi-field search within a single query string. For expert users only.

-> 컴팩트 한 Lucene 쿼리 문자열 구문을 지원하므로 단일 쿼리 문자열 내에서 AND | OR NOT 조건과 다중 필드 검색을 지정할 수 있습니다.

-> 검색이 실행될 필드를 지정하고 쿼리에 사용된 AND|OR|NOT 조건에 사용된 값들은 독립적으로 텍스트를 분석해서 결과를 도출한다.

-> 단 Lucene 파서를 사용하기 때문에 reserved character가 들어간 경우 검색이 안되니 반드시 \\ 이것을 붙혀서 escape 처리를 해줘야 한다.

"query": {
    "query_string" : {
        "default_field" : "content",
        "query" : "this AND that OR thus"
    }
}


simple_query_string query

A simpler, more robust version of the query_string syntax suitable for exposing directly to users.

-> query_string을 더 간단하게 사용할 수 있도록 제공된 쿼리




Term level queries

While the full text queries will analyze the query string before executing, the term-level queriesoperate on the exact terms that are stored in the inverted index, and will normalize terms before executing only for keyword fields with normalizer property.

These queries are usually used for structured data like numbers, dates, and enums, rather than full text fields. Alternatively, they allow you to craft low-level queries, foregoing the analysis process.


term query

Find documents which contain the exact term specified in the field specified.

-> 검색하고자 하는 필드에 정확한 텀을 포함하고 있는지 확인하는 쿼리


terms query

Find documents which contain any of the exact terms specified in the field specified.

-> 검색하고자 하는 필드에서 정확한 텀들을 포함하고 있는지 확인하는 쿼리


terms_set query

Find documents which match with one or more of the specified terms. The number of terms that must match depend on the specified minimum should match field or script.

-> 지정된 용어 중 하나 이상과 일치하는 문서를 찾는다. 지정된 최소값과 일치해야하는 용어의 수는 필드 또는 스크립트와 일치해야 한다.

"query": {
    "terms_set": {
        "codes" : {
            "terms" : ["abc", "def", "ghi"],
            "minimum_should_match_field": "required_matches"
        }
    }
}


range query

Find documents where the field specified contains values (dates, numbers, or strings) in the range specified.

-> 검색하고자 하는 필드에서 입력한 범위에 포함되는 날짜나, 숫자, 문자열등을 검색할 때 사용.


exists query

Find documents where the field specified contains any non-null value.

-> 검색하고자 하는 필드에 값이 있는지 여부 확인


prefix query

Find documents where the field specified contains terms which begin with the exact prefix specified.

->검색하고자 하는 필드에서 입력한 값으로 시작하는 문장이 있는지 검색할 때 사용


wildcard query

Find documents where the field specified contains terms which match the pattern specified, where the pattern supports single character wildcards (?) and multi-character wildcards (*)

-> 와이드카드 *, ?를 사용해서 검색하는 방법. 전체를 다 뒤져서 찾아야하기 때문에 성능에 아주 안좋은 결과를 초래한다.


regexp query

Find documents where the field specified contains terms which match the regular expression specified.

-> 정규식을 이용해서 정확한 문장 찾기


fuzzy query

Find documents where the field specified contains terms which are fuzzily similar to the specified term. Fuzziness is measured as a Levenshtein edit distance of 1 or 2.

-> 입력한 term과 비슷한 문자를 찾을 때 사용하는 쿼리 레벤스테인 거리 알고리즘을 사용하고 설정한 거리에 따라서 어느정도 유사도에 값을 찾을지 정할 수 있다.


type query

Find documents of the specified type.

-> 입력한 타입에 맞는 값을 찾는 쿼리

"query": {
    "query_string" : {
        "default_field" : "content",
        "query" : "this AND that OR thus"
    }
}


ids query

Find documents with the specified type and IDs.

-> 타입과 IDS를 가진 값을 찾는 쿼리

"query": {
    "ids" : {
        "type" : "_doc",
        "values" : ["1", "4", "100"]
    }
}












match_phrase와 term의 차이 참고 사이트

https://findstar.pe.kr/2018/01/19/understanding-query-on-elasticsearch/

반응형