level_zebra
level_zebra

Reputation: 1533

GROUP BY in elasticsearch

I am trying to write a GROUP BY query in elastic search using version 5.2

I want to query the data and limit that down to those which have a particular 'tag'. In the case below. I want to select items which contain the word "FIY" in the title or content fields and then narrow that down so as to only search those documents which have the tags "FIY" and "Competition"

The query part is fine but I am struggling to limit it to the given tag.

So far I have got, but I am getting the error.

"reason": "[bool] query does not support [terms]",

GET advice-articles/_search
{
  "query": {
  "bool": {
  "must": [
    {
      "multi_match": {
        "query": "FIY",
        "fields": ["title", "content"]
      }
    }
  ], "filter": {
    "bool": {
      "terms": {
        "tags.tagName": [
           "competition"
        ]
      }
    }
  }
}
 }
}

an example index is

"_index": "advice-articles",
    "_type": "article",
    "_id": "1460",
    "_score": 4.3167734,
    "_source": {
      "id": "1460",
      "title": "Your top FIY tips",
      "content": "Fix It Yourself in April 2012.",
      "tags": [
        {
          "tagName": "Fix it yourself"
        },
        {
          "tagName": "customer tips"
        },
        {
          "tagName": "competition"
        }
      ]  

the mappings I have are as follows

{
"advice-articles": {
"mappings": {
  "article": {
    "properties": {
      "content": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "tags": {
        "type": "nested",
        "properties": {
          "tagName": {
            "type": "text",
            "fields": {
              "raw": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}
}

}

Upvotes: 0

Views: 1547

Answers (2)

Rahul
Rahul

Reputation: 16335

bool query built using one or more boolean clauses, each clause with a typed occurrence. The occurrence types are: must, must_not, filter, should

GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "FIY",
            "fields": [
              "title",
              "content"
            ]
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "terms": {
                "tags.tagName": [
                  "competition"
                ]
              }
            }
          }
        }
      ]
    }
  }
} 

Here is how you can use a must clause for your query requirements.

Upvotes: 1

natnael88
natnael88

Reputation: 1128

Inside the filter you dont need to put bool.

POST newindex/test/1460333
{
  "title": "Your top FIY tips",
  "content": "Fix It Yourself in April 2012.",
  "tags": [
    {
      "tagName": "Fix it yourself"
    },
    {
      "tagName": "customer tips"
    },
    {
      "tagName": "shoud not return"
    }
  ]
}

POST newindex/test/1460
{
  "title": "Your top FIY tips",
  "content": "Fix It Yourself in April 2012.",
  "tags": [
    {
      "tagName": "Fix it yourself"
    },
    {
      "tagName": "customer tips"
    },
    {
      "tagName": "competition"
    }
  ]
}

Query:

GET newindex/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "FIY",
            "fields": [
              "title",
              "content"
            ]
          }
        }
      ],
      "filter": {
        "terms": {
          "tags.tagName": [
            "competition"
          ]
        }
      }
    }
  }
}

Result :

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "newindex",
        "_type": "test",
        "_id": "1460",
        "_score": 0.2876821,
        "_source": {
          "title": "Your top FIY tips",
          "content": "Fix It Yourself in April 2012.",
          "tags": [
            {
              "tagName": "Fix it yourself"
            },
            {
              "tagName": "customer tips"
            },
            {
              "tagName": "competition"
            }
          ]
        }
      }
    ]
  }
}

Upvotes: 1

Related Questions