[[query-dsl-regexp-filter]]
=== Regexp Filter

The `regexp` filter is similar to the
<<query-dsl-regexp-query,regexp>> query, except
that it is cacheable and can speedup performance in case you are reusing
this filter in your queries.

See <<regexp-syntax>> for details of the supported regular expression language.

[source,js]
--------------------------------------------------
{
    "filtered": {
        "query": {
            "match_all": {}
        },
        "filter": {
            "regexp":{
                "name.first" : "s.*y"
            }
        }
    }
}
--------------------------------------------------

You can also select the cache name and use the same regexp flags in the
filter as in the query.

Regular expressions are dangerous because it's easy to accidentally
create an innocuous looking one that requires an exponential number of
internal determinized automaton states (and corresponding RAM and CPU)
for Lucene to execute.  Lucene prevents these using the
`max_determinized_states` setting (defaults to 10000).  You can raise
this limit to allow more complex regular expressions to execute.

You have to enable caching explicitly in order to have the
`regexp` filter cached.

[source,js]
--------------------------------------------------
{
    "filtered": {
        "query": {
            "match_all": {}
        },
        "filter": {
            "regexp":{
                "name.first" : {
                    "value" : "s.*y",
                    "flags" : "INTERSECTION|COMPLEMENT|EMPTY",
		    "max_determinized_states": 20000
                },
                "_name":"test",
                "_cache" : true,
                "_cache_key" : "key"
            }
        }
    }
}
--------------------------------------------------
