(ElasticSearch) query의 종류

1. MATCH_ALL 쿼리

모든 도큐먼트를 일치하게 된다.
쿼리 대신 필터 사용이 필요할 때, match_all쿼리가 상당히 유용하다
(점수에 관해 신경쓰지 않을 떄)

또는 검색하는 색인과 타입 사이에서 모든 도큐먼트를 반환하고 싶을 때 유용하다.

예)
GET get-together/_search
{
"query" : {
"match_all" : {}
}
}


검색에 쿼리 부분대신 필터를 사용하면 쿼리는 이와 같다.

GET get-together/_search
{
"query" : {
"match_all" : {}
},
"filter" : {
....
}
}



2. QUERY_STRING 쿼리


다른 대체제로 하는 것을 추천



3. 텀 쿼리와 텀 필터


텀 쿼리와 필터는 실행 가능한 가장 단순한 쿼리인데, 필드와 텀을 지정해서 도큐먼트 내에서 검색할 수 있다.
검색한 텀이 분석되지 않았기 때문에 완전히 일치하는 도큐먼트 결과만 찾는다는 것을 알아두자.

예)
GET get-together/_search
{
"query" : {
"term" : {
"tags" : "elasticsearch"
}
},
"_source" : ["name", "tags"]
}

결과값

{
"hits" : [
{
"_id" : "3",
"_index" : "get-together",
"_score" : 1.0769442,
"_type" : "_doc",
"_source" : {
"name" : "ElasticSearch San Francisco",
"tags" :[
"elasticsearch",
"big data",
"lucene",
"open source"
]
}
}
]
}

텀필터는 점수에 영향을 미치지 않을 검색에 사용된다.

GET get-together/_search
{
"query" : {
"match_all" : {}
},
"filter" : {
"term" : {
"tags" : "elasticsearch"
}
}
}



4. Terms쿼리

텀 쿼리와 유사하게, 도큐먼트 필드에서 다중 텀으로 검색할 수 있다. 다음 예제는 "jvm", "hadoop"중 어느 하나와 일치하는 태그의 그룹을 검색한다.

GET get-together/_search
{
"query" : {
"terms" : {
"tags" : ["jvm", "hadoop"]
}
},
"_source" : ["name" , "hadoop"]
}


5. Match쿼리와 텀필터


텀쿼리와 유사하게 매치 쿼리는 검색하려는 필드와 검색하려는 문자열을 포함하는 해시 맵인데, 필드나 한 번에 모든 필드를 검색하는 _all필드가 올 수 있다.

매치쿼리는 몇몇 서로 다른 방식으로 동작할 수 있다.
두가지 기능은 boolean과 phrase이다.



 * BOOLEAN 기능

기본ㅈ거으로, 쿼리 매치는 Boolean기능과 OR연산을 사용한다.
예를들어, "ElasticSearch Denver"을 사용한다면 "ElasticSearch OR Denver"로 검색해서
"ElasticSearch Amsterdam"과 "Denver Clojure Group" 모두를 구한다.


GET get-together/_search
{
"query" : {
"match" : {
"name" : {
"query" : "ElasticSearch Denver",
"operator" : "and"
}
}
}
}



* PHRASE 쿼리 기능


도큐먼트 내에서 각 단어의 위치에 따른 leeway값처럼 특정 구(Phrase)를 검색할 때 유용하다.
Leeway는 slop으로 불리는데 구문 내에서 토큰 사이의 거리를 표현하는 수치값이다.
get-together의 그룹 name을 기억해 내려 할 때, "Enterprise"와 "London"단어는 기억하나 name의 나머지는 기억하지 못한다고 하자.
"enterprise london"구문을 기본값 0 대신 slop을 1또는 2로 설정해서 완전한 그룹 제목을 몰라도 구문을 포함하는 결과를 찾아 검색할 수 있다.


GET get-together/_search
{
"query" : {
"match" : {
"name" : {
"type" : "phrase",
"query" : "enterprise london",
"slop" : 1
}
}
},
"_source" : ["name", "desription"]
}



6. Phrase_prefix쿼리


Match_phrase 쿼리와 유사하게 match_phrase_prefix쿼리는 phrase로 검색하는 것에 더해서 phrase내에서 마지막 텀에 프리픽스 매칭을 허용한다.
이 기능은 검색을 제안하는 검색창에서 사용자가 검색 텀을 입력하는 동안 자동완성을 제공하는 데 정말 유용하다.
이런 유형의 기능으로 검색을 사용할 때, max_expansions설정을 사용해서, 검색이 반환할 이해 가능한 수준의 총 소요 시간 내에서 확장할 프리픽스의 최댓값을 설정하는 것이 좋을것이다.

다음 예제는 "elasticsearch den"이 phrase_prefix쿼리로 사용되었다.
엘라스틱서치는 "den"텍스트를 가지고 "den"으로 시작하는(예를들어, "Denver") name필드의 모든 갑을 찾는다.검색 규모가 커질 가능성이 있으므로 꼭 expansions값으로 제한한다.



GET get-together/_search
{
"query" : {
"match" : {
"name" : {
"type" : "phrase_prefix",
"query" : "Elasticsearch den",
"max_expansions" : 1
}
}
},
"_source" : ["name"]
}


7. MULTI_MATCH로 다중 필드 일치


다중 필드의 값을 검색하도록 허용한다.


GET get-together/_search
{
"query" : {
"multi_match" : {
"query" : "elasticsearch hadoop",
"fields" : ["name" ,"description"]
}
}
}

이또한 타입으로 phrase, phrase_prefix등을 사용할 수 있다.

매치쿼리를 사용하면 어떠한 것도 검색할 수 있는데, 이는 대부분의 경우 기본적으로 사용할 수 있는 쿼리타입이라 할 수 있어, 가능한 이를 사용하자.



댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기