Elasticsearch query context와 filter context 알아보기

안녕하세요. Elastic Stack을 공부하고 있는 서버개발자입니다.

logstash를 통해 elastic search에 데이터를 넣은 후 검색에 대한 공부를 진행하였습니다.

오늘은 query context와 filter context가 어떻게 다른지를 알아보았습니다.

우선, 이 포스팅을 보시는 분들은 이미 elasticsearch를 설치하였고 공부를 시작했다고 가정하겠습니다.

만약 elsticsearch를 설치하지 않았으며 설치를 했지만 데이터가 없다면 제가 작성한 logstash를 사용해서 CSV파일을 elastic search에 임포트하기편을 참고해보세요.


Elastic search를 통해 검색을 할 경우 쿼리 콘텍스트(query context)필터 콘텍스트(filter context)에 따라 달라집니다.

Query context

Query context는 쿼리 절이 “쿼리가 문서와 일치 하는가?”라는 질문에 답하며 _score를 통해 문서가 다른 문서와 비교하여 쿼리와 얼마나 일치하는지를 계산합니다.

Filter Context

Filter Context는 쿼리절이 “쿼리가 문서와 일치하는가?”라는 질문에 답하지만 _score는 계산하지 않습니다.

대부분 필터링을 위해 사용합니다.

example

예제를 통해 무엇이 다른지 확인해 볼게요

  • message 필드에 “africa”가 포함된 것.
  • item_type 필드가 “clothes” 인 것.
curl "localhost:9200/sales-records/_search?pretty" -H "Content-Type:application/json" -d '
{
  "query": {
    "bool": {
      "must": [
        {"match": {"message": "africa"}}
      ],
      "filter": [
        {"term": {"item_type": "clothes"}}
      ]}
    },
    "size": 2
}'

“query”는 query context에서 동작합니다. “bool”“must”는 query context에서 사용됩니다. 얼마나 일치하는 지를 평가하는데 사용됩니다.

“filter는 filter context에서 동작하며 “term”은 filter context에서 사용됩니다. 일치하는 문서는 걸러내지만 점수에는 영향을 주지 않습니다.

{
  "took": 17,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10000,
      "relation": "gte"
    },
    "max_score": 1.2925828,
    "hits": [
      {
        "_index": "sales-records",
        "_type": "_doc",
        "_id": "Dn9aY2oBml718jk9tcNd",
        "_score": 1.2925828,
        "_source": {
          "total_profit": 37674.72,
          "sales_channel": "Online",
          "order_id": 653758466,
          "units_sold": 513,
          "tags": ["_dateparsefailure"],
          "total_revenue": 56060.64,
          "unit_cost": 35.84,
          "country": "South Africa",
          "order_priority": "M",
          "ship_date": "3/16/2013",
          "unit_price": 109.28,
          "total_cost": 18385.92,
          "item_type": "Clothes",
          "region": "Sub-Saharan Africa",
          "@version": "1",
          "host": "c5ceb9b17956",
          "order_date": "2/21/2013",
          "path": "/config-dir/1500000 Sales Records.csv",
          "message": "Sub-Saharan Africa,South Africa,Clothes,Online,M,2/21/2013,653758466,3/16/2013,513,109.28,35.84,56060.64,18385.92,37674.72\r",
          "@timestamp": "2019-04-28T09:50:49.700Z"
        }
      },
      {
        "_index": "sales-records",
        "_type": "_doc",
        "_id": "nn9aY2oBml718jk9tcOa",
        "_score": 1.2925828,
        "_source": {
          "total_profit": 28054.08,
          "sales_channel": "Online",
          "order_id": 669640576,
          "units_sold": 382,
          "tags": ["_dateparsefailure"],
          "total_revenue": 41744.96,
          "unit_cost": 35.84,
          "country": "South Africa",
          "order_priority": "C",
          "ship_date": "11/21/2015",
          "unit_price": 109.28,
          "total_cost": 13690.88,
          "item_type": "Clothes",
          "region": "Sub-Saharan Africa",
          "@version": "1",
          "host": "c5ceb9b17956",
          "order_date": "11/17/2015",
          "path": "/config-dir/1500000 Sales Records.csv",
          "message": "Sub-Saharan Africa,South Africa,Clothes,Online,C,11/17/2015,669640576,11/21/2015,382,109.28,35.84,41744.96,13690.88,28054.08\r",
          "@timestamp": "2019-04-28T09:50:49.789Z"
        }
      }
    ]
  }
}

정확한 검색이 아닌 유사검색(문자 검색)과 같은 것은 query context를 사용하고 정확한 검색을 원할때는 filter context를 사용하면 될 것 같습니다.




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 백엔드 개발자가 리액트 네이티브로 달력 앱을 배포해보았습니다.
  • MySQL 실시간 쿼리 확인하기
  • MySQL 트랜잭션 격리수준 Isolation level 알아보기
  • 레디스에 대한 간단한 설명과 성능향상시키기
  • Apple login 사용해보기