5.4 Bool : Should
이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민([email protected])에게 사용 내용을 알려주시기 바랍니다.
bool 쿼리의 should 는 검색 점수를 조정하기 위해 사용할 수 있습니다. 먼저 match 쿼리로 fox 를 포함하고 있는 도큐먼트를 검색 한 결과입니다.
request
response
match 쿼리로 fox 검색
1
GET my_index/_search
2
{
3
"query": {
4
"match": {
5
"message": "fox"
6
}
7
}
8
}
Copied!
match 쿼리로 fox 검색 결과
1
{
2
"took" : 1,
3
"timed_out" : false,
4
"_shards" : {
5
"total" : 1,
6
"successful" : 1,
7
"skipped" : 0,
8
"failed" : 0
9
},
10
"hits" : {
11
"total" : {
12
"value" : 4,
13
"relation" : "eq"
14
},
15
"max_score" : 0.32951736,
16
"hits" : [
17
{
18
"_index" : "my_index",
19
"_type" : "_doc",
20
"_id" : "1",
21
"_score" : 0.32951736,
22
"_source" : {
23
"message" : "The quick brown fox"
24
}
25
},
26
{
27
"_index" : "my_index",
28
"_type" : "_doc",
29
"_id" : "4",
30
"_score" : 0.32951736,
31
"_source" : {
32
"message" : "Brown fox brown dog"
33
}
34
},
35
{
36
"_index" : "my_index",
37
"_type" : "_doc",
38
"_id" : "2",
39
"_score" : 0.23470737,
40
"_source" : {
41
"message" : "The quick brown fox jumps over the lazy dog"
42
}
43
},
44
{
45
"_index" : "my_index",
46
"_type" : "_doc",
47
"_id" : "3",
48
"_score" : 0.23470737,
49
"_source" : {
50
"message" : "The quick brown fox jumps over the quick dog"
51
}
52
}
53
]
54
}
55
}
Copied!
이 결과들 중 lazy 가 포함된 결과에 가중치를 줘서 상위로 올리고 싶으면 다음과 같이 should 안에 lazy 를 찾는 검색을 추가합니다.
request
response
fox 검색 결과 중 lazy 를 포함한 결과에 가중치 부여
1
GET my_index/_search
2
{
3
"query": {
4
"bool": {
5
"must": [
6
{
7
"match": {
8
"message": "fox"
9
}
10
}
11
],
12
"should": [
13
{
14
"match": {
15
"message": "lazy"
16
}
17
}
18
]
19
}
20
}
21
}
Copied!
fox 검색 결과 중 lazy 를 포함한 결과에 가중치 부여 결과
1
{
2
"took" : 1,
3
"timed_out" : false,
4
"_shards" : {
5
"total" : 1,
6
"successful" : 1,
7
"skipped" : 0,
8
"failed" : 0
9
},
10
"hits" : {
11
"total" : {
12
"value" : 4,
13
"relation" : "eq"
14
},
15
"max_score" : 0.9489644,
16
"hits" : [
17
{
18
"_index" : "my_index",
19
"_type" : "_doc",
20
"_id" : "2",
21
"_score" : 0.9489644,
22
"_source" : {
23
"message" : "The quick brown fox jumps over the lazy dog"
24
}
25
},
26
{
27
"_index" : "my_index",
28
"_type" : "_doc",
29
"_id" : "1",
30
"_score" : 0.32951736,
31
"_source" : {
32
"message" : "The quick brown fox"
33
}
34
},
35
{
36
"_index" : "my_index",
37
"_type" : "_doc",
38
"_id" : "4",
39
"_score" : 0.32951736,
40
"_source" : {
41
"message" : "Brown fox brown dog"
42
}
43
},
44
{
45
"_index" : "my_index",
46
"_type" : "_doc",
47
"_id" : "3",
48
"_score" : 0.23470737,
49
"_source" : {
50
"message" : "The quick brown fox jumps over the quick dog"
51
}
52
}
53
]
54
}
55
}
Copied!
새로운 검색 결과에서 fox만 포함하고 있던 "The quick brown fox" 는 점수가 "_score" : 0.32951736 로 이전 match 쿼리와 동일하지만, lazy를 함께 포함하고 있는 "The quick brown fox jumps over the lazy dog" 는 점수가 "_score" : 0.9489644로 가중되어 가장 상위에 나타납니다.
shouldmatch_phrase 와 함께 유용하게 사용할 수 있습니다. 쇼핑몰 상품 검색 같은 사례에서는 보통 검색어로 입력된 단어가 하나라도 포함된 결과들은 모두 가져오도록 되어 있을 것입니다. 이 때 검색 결과 중에서 입력한 검색어 전체 문장이 정확히 일치하는 결과를 맨 상위에 위치시키면 다른 결과들을 누락시키지 않으면서 사용자가 정확하게 원하는 수준 높은 품질의 결과를 제공할 수 있을 것입니다.
다음은 lazy 또는 dog 중 하나라 포함된 도큐먼트를 모두 검색하면서 그 중에 "lazy dog" 구문을 정확히 포함하는 결과들을 가장 상위로 가져옵니다. must 안에 match 쿼리로 lazy 또는 dog가 포함된 모든 도큐먼트를 검색하고 should 안에 match_phrase 쿼리를 써서 스코어 점수를 높입니다.
request
response
lazy 또는 dog 를 검색하면서 "lazy dog" 구문을 포함한 결과에 가중치 부여
1
GET my_index/_search
2
{
3
"query": {
4
"bool": {
5
"must": [
6
{
7
"match": {
8
"message": {
9
"query": "lazy dog"
10
}
11
}
12
}
13
],
14
"should": [
15
{
16
"match_phrase": {
17
"message": "lazy dog"
18
}
19
}
20
]
21
}
22
}
23
}
Copied!
lazy 또는 dog 를 검색하면서 "lazy dog" 구문을 포함한 결과에 가중치 부여 결과
1
{
2
"took" : 3,
3
"timed_out" : false,
4
"_shards" : {
5
"total" : 1,
6
"successful" : 1,
7
"skipped" : 0,
8
"failed" : 0
9
},
10
"hits" : {
11
"total" : {
12
"value" : 4,
13
"relation" : "eq"
14
},
15
"max_score" : 1.897929,
16
"hits" : [
17
{
18
"_index" : "my_index",
19
"_type" : "_doc",
20
"_id" : "2",
21
"_score" : 1.897929,
22
"_source" : {
23
"message" : "The quick brown fox jumps over the lazy dog"
24
}
25
},
26
{
27
"_index" : "my_index",
28
"_type" : "_doc",
29
"_id" : "5",
30
"_score" : 1.449395,
31
"_source" : {
32
"message" : "Lazy jumping dog"
33
}
34
},
35
{
36
"_index" : "my_index",
37
"_type" : "_doc",
38
"_id" : "4",
39
"_score" : 0.32951736,
40
"_source" : {
41
"message" : "Brown fox brown dog"
42
}
43
},
44
{
45
"_index" : "my_index",
46
"_type" : "_doc",
47
"_id" : "3",
48
"_score" : 0.23470737,
49
"_source" : {
50
"message" : "The quick brown fox jumps over the quick dog"
51
}
52
}
53
]
54
}
55
}
Copied!
이렇게 shouldmatch_phrase를 응용하면 쇼핑몰에서 "스키 장갑" 같은 단어로 검색했을 때 스키 용품들과 각종 장갑들을 모두 가져오면서 그 중 스키 장갑을 가장 상위에 표시할 수 있습니다. slop:1을 이용하면 "스키 보드 장갑", "스키 벙어리 장갑" 같이 스키와 장갑 사이에 다른 값이 들어간 결과에도 가중치를 부여할 수 있습니다.
Copy link