기능을 제공하기 위해 드롭 다운 목록에로드 된 상당히 큰 terms
집계 된 결과가 있습니다.elasticsearch 대 MUST_NOT (반대) 차이점
내 드롭 다운 목록에는 4000 개가 넘는 동물이 있습니다. 내 다른 드롭 다운 목록에는 4 개의 동물 색상이 있습니다.
예,
animal --> ["dog", "cat", "rabbit", ........ , "squirrel"]
color --> ["black", "white", "grey", "brown"]
elasticseatch
의 문서는 다음과 같습니다 : 기본적으로
{"animal": "dog", "color": "white"},
....
{"animal": "cat", "color": "white"},
....
{"animal": "rabbit", "color": "grey"},
....
{"animal": "squirrel", "color": "brown"}
, 내 드롭 다운 목록 내부 checkboxes
의 모든 checked
및 Elasticsearch 있습니다 포함 된 모든 결과를 반환합니다. 이제 선택한 동물 색을 기준으로 다른 필드 animal_features
의 카디널리티 결과를보고 싶습니다. 아무 것도 내 드롭 다운 목록에 checked
경우 실제로 쉽게 수행 할 수 및 그냥 다음 쿼리를 실행할 수 있습니다. 이 쿼리는 color = black 일 때 예상되는 카디널리티 결과를 반환합니다.
{
"query": {
"bool": {
"must": [
{"match": { "color": "black"}}
]
}
},
"aggs": {
"unique_animal_features": {
"cardinality": {
"field": "animal_features",
"precision_threshold" : 40000
}
}
}
}
그러나 모든 동물 및 색상은 기본적으로 checked
입니다. color = black 일 때 여전히 카디널리티 결과를 원한다고 가정 해 봅시다. 따라서 제 경우에는 검정색 이외의 모든 색상을 선택 취소해야합니다. 그래서 나는 흰 색, 회색, 갈색을 선택 취소했다.
두 번째 쿼리에서 나는 must_not
쿼리를 사용하여 결과에서 검은 색이 아닌 다른 색을 제외하려고하므로 Elasticsearch가 나에게 동일한 결과를 반환 할 것으로 기대합니다.
{
"query": {
"bool": {
"must_not": [
{
"match": {
"color": "white"
}
},
{
"match": {
"color": "grey"
}
},
{
"match": {
"color": "brown"
}
}
]
}
},
"aggs": {
"unique_animal_features": {
"cardinality": {
"field": "animal_features",
"precision_threshold" : 40000
}
}
}
]
}
그러나, 두 번째 쿼리는 대부분 부정확 한 카디널리티 결과를 반환합니다. 두 번째 쿼리를 사용해야하지만 첫 번째 쿼리와 마찬가지로 결과가 필요합니다. 두 번째 쿼리를 어떻게 최적화 할 수 있습니까?
참고 : 첫 번째 쿼리와 두 번째 쿼리의 유일한 차이점은 첫 번째 쿼리의 경우 단색 이외의 아무것도 선택되지 않는다는 것입니다. 그러나 두 번째 쿼리의 경우 사용자가 색상을 선택 취소하기 전까지 기본적으로 동물뿐만 아니라 색상을 포함한 모든 항목이 선택됩니다.
단 4 색 이상입니까? –
@hatim 단 4 색. – summerNight