R&D/클라우드

elastic search query

sunshout 2018. 9. 4. 16:28

P.S.

아래 내용은 Elastic Search 5.x 에서는 동작하지 않을 수 있습니다. (Deplicated)


출력 관련

출력 필터링

* fields: [필드, ...]

기본적으로는 매치된 문서의 모든 필드가 출력된다. 일부 필드만 출력하고 싶을 땐 "fields"를 추가하면 된다.


예제) 필드 중에 user, created_at 만 출력함

GET /_search
{
  "fields" : ["user", "created_at"],
  "query" : {
    "term" : {"title" : "민주노총"}
  }
}


페이지 나누기  (Pagination)

* from: 값 (default: 0)

* size:  값 (default: 10)


예제) 검색 결과 중 10번째 문서부터 5개의 문서 가져오기

GET /_search
{
  "from": 10,
  "size": 5,
  "query" : {
    "term" : {"title" : "민주노총"}
  }
}


정렬

* sort: [{필드: {옵션, ...}}, ...]

예) 작성자 오름차순, 작성일 내림차순, 연관성 순으로 정렬

GET /_search
{
  "sort": [
    {"writer": {"order": "asc""}},
    {"created_at": {"order": "desc""}},
    "_score"
  ],
  "query" : {
    "term" : {"title" : "민주노총"}
  }
}


쿼리와 필터

쿼리필터
연관성YES/NO
캐시 불가캐시 가능
느림빠름

성능을 위해서는 필터를 먼저 한 뒤에 쿼리를 하는 것이 효과적이다.


GET /_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": {"genre": "편지"}
      },
      "query": {
        "match": {"title": "민주노총"}
      }
    }
  }
}


필터

필터는 문서를 조건에 따라 참/거짓으로 평가하고, 참인 것만 골라낸다.

문서가 지정된 조건과 얼마나 유사한지(_score)는 평가하지 않는다. boost 옵션을 지정하지 않으면, 매치된 문서의 유사도(_score)는 모두 1점이다.


유사도를 평가하지 않기 때문에 쿼리에 비해 성능이 좋다. 캐시도 지원한다.


term 필터

* query: filtered: filter: term: <Field>: <Term>

지정된 필드에 지정된 텀이 들어있는 문서와 매치된다. 완전히 일치할 때만 매치한 것으로 본다.

예제) 장르가 편지인 문서

GET /_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": {"genre": "편지"}
      }
    }
  }
}


terms 필드

* query: filtered: filter: term: <Field>: [<Term1>, ...]

term 필터와 유사하지만, 복수의 텀을 배열로 지정할 수 있다.  (OR 조건)

예제) 키워드에 민주노총 또는 민주노동당이 포함된 문서

GET /_search
{
  "query": {
    "filtered": {
      "filter": {
        "terms": {"keyword": ["민주노총", "민주노동당"]}
      }
    }
  }
}


bool 필터

  • query: filtered: filter: bool: must|should|must_not: [필터]
  • query: filtered: filter: bool: must|should|must_not: {옵션}

필터를 AND, OR, NOT 논리 연산으로 결합하는 데 쓰인다.

  • must: 문서가 모든 필터에 매치되어야 매치된다. (AND)
  • should: 문서가 하나의 필터라도 매치되면 매치된다. (OR)
  • must_not: 문서가 필터에 매치되지 않아야 매치된다. (NOT)

예) 장르가 편지, 키워드가 비정규직이고, 키워드에 현대자동차 또는 파업이 포함돼 있으며, 키워드에 현대중공업이 없는 문서

GET /_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {"term": {"genre": "편지"}},
            {"term": {"keyword": "비정규직"}}
          ],
          "should": [
            {"term": {"keyword": "현대자동차"}},
            {"term": {"keyword": "파업"}}
          ],
          "must_not": [
            {"term": {"keyword": "현대중공업"}}
          ]
        }
      }
    }
  }
}




예제는 모두 참조에서 가져온 것입니다.

참조: https://bakyeono.net/post/2016-08-20-elasticsearch-querydsl-basic.html