[Elasticsearch] BoolQueryBuilder + TermsQueryBuilder 사용 시 minimum_should_match와 min_should_match
Elastic/Elasticsearch 2016. 5. 24. 18:11이게 또 언제 변수명이 바뀌었을까요?
버전 릴리즈 될때마다 소스코드를 다 따라 갈수가 없다 보니 이런 오류를 경험하게 되내요.
주의) min_should_match 는 java api 를 이용해서는 사용 할 수 없습니다.
[Terms Query]
이 쿼리는 field 에 여러개의 term 을 넣어서 질의 할 수 있도록 해줍니다.
그래서 기본 or 검색을 지원하고 있구요. 여기서 and 연산을 하고 싶으면 terms query 에 아래 변수 값을 지정 하셔야 합니다.
min_should_match:TERM_SIZE
OR)
curl -XGET "http://localhost:9200/_search?pretty" -d'
{
"size": 10,
"query" : {
"terms": {
"title": [
"포니",
"이펙트"
],
"min_should_match": 1
}
}
}'
AND)
curl -XGET "http://localhost:9200/_search?pretty" -d'
{
"size": 10,
"query" : {
"terms": {
"title": [
"포니",
"이펙트"
],
"min_should_match": 2
}
}
}'
[Bool Query + Terms Query]
이 쿼리는 compound query 작성을 위해 많이 사용하는 것입니다.
bool query 안에 terms query 를 섞어 사용하는 것이구요. 좀 더 and, or 연산을 다양하게 할 수 있게 해줍니다.
여기서는 miminum_should_match 를 통해서 and, or 연산을 해야 하는데 terms query 에서의 min_should_match 를 사용하지 않게 되면 정상적인 결과를 얻을 수 없게 됩니다. (아무래도 2.3.3 에서 5.0 으로 넘어가는 과도기라 그런게 아닌가 싶습니다.)
should 를 여러개 사용할 경우 miminum_should_match 설정을 하셔야 합니다.
OR)
curl -XGET "http://localhost:9200/_search?pretty" -d'
{
"size": 10,
"query" : {
"bool" : {
"should": [
{
"terms": {
"title": [
"포니",
"이펙트"
],
"min_should_match": "1"
}
}
]
}
}
}'
AND)
curl -XGET "http://localhost:9200/_search?pretty" -d'
{
"size": 10,
"query" : {
"bool" : {
"should": [
{
"terms": {
"title": [
"포니",
"이펙트"
],
"min_should_match": "2"
}
}
]
}
}
}'