Skip to content

Instantly share code, notes, and snippets.

@rukeba
Created March 26, 2021 15:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rukeba/2afa51aa7073d3df05dc8a3d74ee1832 to your computer and use it in GitHub Desktop.
Save rukeba/2afa51aa7073d3df05dc8a3d74ee1832 to your computer and use it in GitHub Desktop.
Facet Search in ElasticSearch: Sample Kibana script
DELETE /p01
PUT /p01
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"facet_string": {
"type": "nested",
"properties": {
"facet_name": {
"type": "keyword"
},
"facet_value": {
"type": "keyword"
}
}
},
"facet_number": {
"type": "nested",
"properties": {
"facet_name": {
"type": "keyword"
},
"facet_value": {
"type": "double"
}
}
}
}
}
}
# Colors: White, Red, Black
# Sizes: S, M, L
# Fabric: Cotton, Silk
POST /p01/_doc
{
"name": "Black L Cotton",
"facet_string" : [
{ "facet_name": "Color", "facet_value": "Black" },
{ "facet_name": "Size", "facet_value": "L" },
{ "facet_name": "Fabric", "facet_value": "Cotton" }
],
"facet_number" : [
{ "facet_name": "list_price", "facet_value": 29.88 },
{ "facet_name": "net_price", "facet_value": 20.77 }
]
}
# select all
POST /p01/_search
{
"query": {
"match_all": {}
}
}
# all aggs only
POST /p01/_search
{
"size": 0,
"aggs": {
"agg_facet_string": {
"nested": {
"path": "facet_string"
},
"aggs": {
"facet_string": {
"terms": {
"field": "facet_string.facet_name"
},
"aggs": {
"facet_value": {
"terms": {
"field": "facet_string.facet_value"
}
}
}
}
}
},
"agg_facet_number": {
"nested": {
"path": "facet_number"
},
"aggs": {
"facet_name": {
"terms": {
"field": "facet_number.facet_name"
},
"aggs": {
"facet_value": {
"histogram": {
"field": "facet_number.facet_value",
"interval": 5,
"min_doc_count": 1
}
}
}
}
}
}
}
}
# search request with single facet filter
# Color = White
POST /p01/_search
{
"query": {
"nested": {
"path": "facet_string",
"query": {
"bool": {
"filter": [
{
"term":
{
"facet_string.facet_name": "Color"
}
},
{
"term": {
"facet_string.facet_value": "White"
}
}
]
}
}
}
},
"aggs": {
"agg_facet_string": {
"nested": {
"path": "facet_string"
},
"aggs": {
"facet_string": {
"terms": {
"field": "facet_string.facet_name"
},
"aggs": {
"facet_value": {
"terms": {
"field": "facet_string.facet_value"
}
}
}
}
}
},
"agg_facet_number": {
"nested": {
"path": "facet_number"
},
"aggs": {
"facet_name": {
"terms": {
"field": "facet_number.facet_name"
},
"aggs": {
"facet_value": {
"histogram": {
"field": "facet_number.facet_value",
"interval": 5,
"min_doc_count": 1
}
}
}
}
}
}
}
}
# search query with two facet filters
# Color = White OR Red
POST /p01/_search
{
"query": {
"nested": {
"path": "facet_string",
"query": {
"bool": {
"filter": [
{
"term":
{
"facet_string.facet_name": "Color"
}
},
{
"terms":
{
"facet_string.facet_value": ["White", "Red"]
}
}
]
}
}
}
},
"aggs": {
"agg_facet_string": {
"nested": {
"path": "facet_string"
},
"aggs": {
"facet_string": {
"terms": {
"field": "facet_string.facet_name"
},
"aggs": {
"facet_value": {
"terms": {
"field": "facet_string.facet_value"
}
}
}
}
}
},
"agg_facet_number": {
"nested": {
"path": "facet_number"
},
"aggs": {
"facet_name": {
"terms": {
"field": "facet_number.facet_name"
},
"aggs": {
"facet_value": {
"histogram": {
"field": "facet_number.facet_value",
"interval": 5,
"min_doc_count": 1
}
}
}
}
}
}
}
}
# ( Color = White OR Red ) AND (Size = M)
POST /p01/_search
{
"query": {
"bool": {
"filter": [
{
"bool": {
"must": [
{
"nested": {
"path": "facet_string",
"query": {
"bool": {
"filter": [
{
"term": {
"facet_string.facet_name": "Color"
}
},
{
"terms": {
"facet_string.facet_value": [
"White",
"Red"
]
}
}
]
}
}
}
},
{
"nested": {
"path": "facet_string",
"query": {
"bool": {
"filter": [
{
"term": {
"facet_string.facet_name": "Size"
}
},
{
"terms": {
"facet_string.facet_value": [
"M"
]
}
}
]
}
}
}
}
]
}
}
]
}
},
"aggs": {
"agg_facet_string": {
"nested": {
"path": "facet_string"
},
"aggs": {
"facet_string": {
"terms": {
"field": "facet_string.facet_name"
},
"aggs": {
"facet_value": {
"terms": {
"field": "facet_string.facet_value"
}
}
}
}
}
},
"agg_facet_number": {
"nested": {
"path": "facet_number"
},
"aggs": {
"facet_name": {
"terms": {
"field": "facet_number.facet_name"
},
"aggs": {
"facet_value": {
"histogram": {
"field": "facet_number.facet_value",
"interval": 5,
"min_doc_count": 1
}
}
}
}
}
}
}
}
# ( Color = White OR Red ) AND (Size = M) AND ( 30 < list_price < 40 )
POST /p01/_search
{
"query": {
"bool": {
"filter": [
{
"bool": {
"must": [
{
"nested": {
"path": "facet_string",
"query": {
"bool": {
"filter": [
{
"term": {
"facet_string.facet_name": "Color"
}
},
{
"terms": {
"facet_string.facet_value": [
"White",
"Red"
]
}
}
]
}
}
}
},
{
"nested": {
"path": "facet_string",
"query": {
"bool": {
"filter": [
{
"term": {
"facet_string.facet_name": "Size"
}
},
{
"terms": {
"facet_string.facet_value": [
"M"
]
}
}
]
}
}
}
},
{
"nested": {
"path": "facet_number",
"query": {
"bool": {
"filter": [
{
"term": {
"facet_number.facet_name": "list_price"
}
},
{
"range": {
"facet_number.facet_value": {
"gte": 30,
"lt": 40
}
}
}
]
}
}
}
}
]
}
}
]
}
},
"aggs": {
"agg_facet_string": {
"nested": {
"path": "facet_string"
},
"aggs": {
"facet_string": {
"terms": {
"field": "facet_string.facet_name"
},
"aggs": {
"facet_value": {
"terms": {
"field": "facet_string.facet_value"
}
}
}
}
}
},
"agg_facet_number": {
"nested": {
"path": "facet_number"
},
"aggs": {
"facet_name": {
"terms": {
"field": "facet_number.facet_name"
},
"aggs": {
"facet_value": {
"histogram": {
"field": "facet_number.facet_value",
"interval": 5,
"min_doc_count": 1
}
}
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment