elasticsearch 학습 노트 (26) - Elasticsearch query DSL 검색 실전

4864 단어 elasticsearch
다음은 ES의 GET+request body 모델을 설명합니다. 일반적으로 HTTP 프로토콜은 get 요청에 request body를 가져오는 것을 허용하지 않는다는 것을 알고 있지만 get은 조회 데이터의 조작을 설명하기에 더욱 적합하기 때문에 이렇게 사용합니다.공교롭게도 현재 많은 브라우저나 서버도 GET+request body 모드를 지원합니다. 지원하지 않는 장면이 발생하면 POST+request body 모드를 사용할 수 있습니다.

1、하나의 예로query DSL이 무엇인지 알 수 있습니다

GET /website/_search
{
  "query": {
    "match_all": {}
  }
}

2、query DSL의 기본 구문

GET /{index}/_search
{
    " "
}

예:
GET /website/_search
{
  "query": {
    "match": {
      "title": "article"
    }
  }
}
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.13353139,
    "hits" : [
      {
        "_index" : "website",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.13353139,
        "_source" : {
          "post_date" : "2017-01-01",
          "title" : "my first article",
          "content" : "this is my first article in this website",
          "author_id" : 11400
        }
      },
      {
        "_index" : "website",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.13353139,
        "_source" : {
          "post_date" : "2017-01-02",
          "title" : "my second article",
          "content" : "this is my second article in this website",
          "author_id" : 11400
        }
      },
      {
        "_index" : "website",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.13353139,
        "_source" : {
          "post_date" : "2017-01-03",
          "title" : "my third article",
          "content" : "this is my third article in this website",
          "author_id" : 11400
        }
      }
    ]
  }
}

3. 여러 검색 기준 조합


검색 수요: title는first를 포함해야 합니다. 콘텐츠는 웹 사이트를 포함할 수도 있고 포함하지 않을 수도 있습니다. author_id는 111이 아니어야 합니다.
GET /website/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "first"
          }
        }
      ],
      "should": [
        {
          "match": {
            "content": "website"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "author_id": 111
          }
        }
      ]
    }
  }
}
{
  "took" : 21,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.1143606,
    "hits" : [
      {
        "_index" : "website",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.1143606,
        "_source" : {
          "post_date" : "2017-01-01",
          "title" : "my first article",
          "content" : "this is my first article in this website",
          "author_id" : 11400
        }
      }
    ]
  }
}

다음은 더욱 복잡한 조합 조회를 첨부한 다음에 생각의 틀로 삼을 수 있다.
GET /website/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "first"
          }
        }
      ],
      "should": [
        {
          "match": {
            "content": "website"
          }
        },
        {
          "bool": {
            "must": [
              {
                "match": {
                  "content": "first"
                }
              }
            ],
            "must_not": [
              {
                "match": {
                  "title": "second"
                }
              }
            ]
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "author_id": 111
          }
        }
      ]
    }
  }
}

좋은 웹페이지 즐겨찾기