Bool

must, must_not, should, filter

should 에 대해 알아보겠습니다.

bool쿼리의 should 는 검색 점수를 조정하기 위해 사용될 수 있다.

match 쿼리로 fox 를 포함하고 있는 Document를 검색한 결과.

  • query
// match 쿼리로 fox 검색
GET my_index/_search
{
  "query": {
    "match": {
      "message": "fox"
    }
  }
}
  • Response
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
		...
  },
  "hits" : {
    "total" : {
      ...
    },
    "max_score" : 0.32951736,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.32951736,
        "_source" : {
          "message" : "The quick brown fox"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 0.32951736,
        "_source" : {
          "message" : "Brown fox brown dog"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.23470737,
        "_source" : {
          "message" : "The quick brown fox jumps over the lazy dog"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.23470737,
        "_source" : {
          "message" : "The quick brown fox jumps over the quick dog"
        }
      }
    ]
  }
}

이 결과들 중 lazy 가 포함된 결과에 가중치를 줘서 결과를 상위에 올리고 싶으면 다음과 같이 should 안에 lazy 를 찾는 검색을 추가한다.

  • query
// fox 검색 결과  lazy  포함한 결과에 가중치 부여

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "fox"
          }
        }
      ],
      "should": [
        {
          "match": {
            "message": "lazy"
          }
        }
      ]
    }
  }
}
  • response
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    ...
  },
  "hits" : {
    "total" : {
      ...
    },
    "max_score" : 0.9489644,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.9489644,
        "_source" : {
          "message" : "The quick brown fox jumps over the lazy dog"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.32951736,
        "_source" : {
          "message" : "The quick brown fox"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 0.32951736,
        "_source" : {
          "message" : "Brown fox brown dog"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.23470737,
        "_source" : {
          "message" : "The quick brown fox jumps over the quick dog"
        }
      }
    ]
  }
}

새로운 검색 결과에서 fox만 포함하고 있던 “The quick brown fox”는 점수가 0.3295... 로 이전 match 쿼리와 동일하지만, lazy 를 함께 포함하고 있는 “The quick brown fox jumps over the lazy dog” 는 점수가 0.9489... 로 가중되어 가장 상위에 나타납니다.

shouldmatch_phrase 와 함께 유용하게 사용가능하다. 보통 쇼핑몰 검색에서 검색어로 입력된 단어가 하나라도 포함된 결과들은 모두 가져오도록 되어있다. 이 때 검색 결과 중에서 입력한 검색어 전체 문장이 정확히 일치하는 결과를 맨 상위에 위치시키면 다른 결과들을 누락시키지 않으면서 사용자가 원하는 수준 높은 품질의 결과를 제공할 수 있을것이다.

  • lazy or dog 중 하나라도 포함된 도큐먼트를 모두 검색
  • 그 중에 lazy dog 구문을 정확히 포함하는 결과를 가장 상위로 노출
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": {
              "query": "lazy dog"
            }
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "message": "lazy dog",
            "slop": 1
          }
        }
      ]
    }
  }
}

slop: 1 값을 주게되면,

“스키 장갑” 으로 검색 시, “스키 벙어리 장갑” 같이 스키와 장갑 사이에 다른 값이 들어간 결과에도 가중치를 부여할 수 있습니다.

댓글남기기