Elasticsearch multi term filter
You should use bool filter
to AND
all your terms:
"query":{ "filtered": { "query": { "query_string": { "query":"*tom*", "default_operator": "OR", "fields": ["username"] } }, "filter": { "bool" : { "must" : [ {"term" : { "isActive" : "1" } }, {"term" : { "isPrivate" : "0" } }, {"term" : { "isOwner" : "1" } } ] } } }}
For version 2.x+ you can use bool
query instead of filtered
query with some simple replacement: https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-filtered-query.html
As one of the comments says, the syntax has changed in recent ES versions. If you are using Elasticsearch 6.+, and you want to use a wildcard and a sequence of terms in your query (such as in the question), you can use something like this:
GET your_index/_search{ "query": { "bool": { "must": [ { "wildcard": { "your_field_name_1": { "value": "tom*" } } }, { "term": { "your_field_name_2": { "value": "US" } } }, { "term": { "your_field_name_3": { "value": "Michigan" } } }, { "term": { "your_field_name_4": { "value": "0" } } } ] } }}
Also, from the documentation about wildcard queries:
Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?.
I hope this helps.