brechtvhb
brechtvhb

Reputation: 1048

Faceted search in webshop with Elastic

I've seen a few examples about faceted search in Elastic but all of them know in advance on what fields you would want created buckets.

How should I work when I have a webshop with multiple categories, where the properties of the values are different in every category?

Is there a way to describe what properties your documents have when you ran a query (eg filter by category)?

I have this query right now:

{
   "from" : 0, "size" : 10,
   "query": {
        "bool" : {
            "must" : [
              { "terms": {"color": ["red", "green", "purple"]} },
              { "terms": {"make": ["honda", "toyota", "bmw"]} }
            ]
        }
   },
   "aggregations": {
     "all_cars": {
         "global": {},
         "aggs": {
              "colors": {
                "filter" : { "terms": {"make": ["honda", "toyota", "bmw"]} },
                "aggregations": {
                    "filtered_colors": { "terms": {"field": "color.keyword"} }
                }
              },
              "makes": {
                "filter" : { "terms": {"color": ["red", "green"]} },
                "aggregations": {
                    "filtered_makes": { "terms": {"field": "make.keyword"} }
                }
              }
          }
      }
   }
}

How can I know on what fields I can make aggregations. Is there a way to describe the properties of a document after running a query? So I can know what the possible fields ,to aggregate on, are.

Upvotes: 0

Views: 199

Answers (2)

brechtvhb
brechtvhb

Reputation: 1048

Right now I am storing all properties of my article in an array and I can quickly aggregate them like this:

{
  "size": 0,
  "aggregations": {
    "array_aggregation": {
      "terms": {
        "field": "properties.keyword",
        "size": 10
      }
    }
  }
}

This is a step in the right direction but that way I don't know what the type of a property is.

Here's a sample object

            "price": 10000,
            "color": "red",
            "make": "honda",
            "sold": "2014-10-28",
            "properties": [
                "price",
                "color",
                "make",
                "sold"
            ]

Upvotes: 1

dadoonet
dadoonet

Reputation: 14492

You can use the filter aggregation which will filter and then create a terms aggregation inside?

Upvotes: 0

Related Questions