Zatvobor/tirexs

Support for nested aggs

greghopkins opened this issue · 2 comments

Hi.

I am trying to convert the following ES request into the Tirexs Query DSL.

GET /<index>/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "range": {
          "created_at": {
            "gte": "2000-01-01",
            "lte": "2020-01-01",
            "format": "yyyy-MM-dd"
          }
        }
      }
    }
  }, 
  "aggs" : {
    "edits": {
      "nested": {
        "path": "edits"
      },
      "aggs": {
        "keywords": {
          "terms": {
            "script" : {
              "source": "List x = []; x.addAll(doc['edits.keywords.mood.raw'].values); x.addAll(doc['edits.keywords.musical.raw'].values); x.addAll(doc['edits.keywords.tv_film.raw'].values); x.addAll(doc['edits.keywords.various.raw'].values); return x"
            },
            "size": 50,
            "order": {
              "_count": "desc"
            }
          }
        }
      }
    }
  }
}

According to my read of the documentation, the equivalent Query DSL would be:

search index: "kontent_core" do
        size(0)

        query do
          bool do
            filter do
              range(
                "created_at",
                from: DateTime.to_unix(start_date),
                to: DateTime.to_unix(end_date)
              )
            end
          end
        end

        aggs do
          edits do
            nested path: "edits" do
              aggs do
                keywords do
                  terms(
                    script:
                      "List x = []; x.addAll(doc['edits.keywords.mood.raw'].values); x.addAll(doc['edits.keywords.musical.raw'].values); x.addAll(doc['edits.keywords.tv_film.raw'].values); x.addAll(doc['edits.keywords.various.raw'].values); return x;",
                    size: limit,
                    order: %{"_count" => order_by_frequency}
                  )
                end
              end
            end
          end
        end
      end

I am getting a compilation error:

** (FunctionClauseError) no function clause matching in Tirexs.Search.Aggs._aggs/2

    The following arguments were given to Tirexs.Search.Aggs._aggs/2:

        # 1
        :nested

        # 2
        [[path: "edits"], [do: {:aggs, [line: 107], [[do: {:keywords, [line: 108], [[do: {:terms, [line: 109], [[script: "List x = []; x.addAll(doc['edits.keywords.mood.raw'].values); x.addAll(doc['edits.keywords.musical.raw'].values); x.addAll(doc['edits.keywords.tv_film.raw'].values); x.addAll(doc['edits.keywords.various.raw'].values); return x;", size: {:limit, [line: 112], nil}, order: {:%{}, [line: 113], [{"_count", {:order_by_frequency, [line: 113], nil}}]}]]}]]}]]}]]

    Attempted function clauses (showing 1 out of 1):

        defp _aggs(name, params) when is_tuple(params)

    (tirexs) lib/tirexs/search/aggs.ex:88: Tirexs.Search.Aggs._aggs/2
    (tirexs) lib/tirexs/search/aggs.ex:10: Tirexs.Search.Aggs.extract/2
    (tirexs) lib/tirexs/search/aggs.ex:96: Tirexs.Search.Aggs.routers/2
    (tirexs) lib/tirexs/search/aggs.ex:10: Tirexs.Search.Aggs.extract/2
    (tirexs) lib/tirexs/search/aggs.ex:96: Tirexs.Search.Aggs.routers/2
    (tirexs) lib/tirexs/search.ex:28: Tirexs.Search.extract/2
    (tirexs) expanding macro: Tirexs.Search.search/2

Thoughts? Thanks!

Hello @greghopkins!
We don't support dsl now. In next version we will remove all dsl from this lib. So use please default elixir types:

aggs: [
   edits: [
      nested: [
       path: "edits",
       aggs: []
     ]
   ]
]

Thanks! Closing.