OpenSearch/docs/reference/query-dsl/terms-query.asciidoc

112 lines
3.0 KiB
Plaintext
Raw Normal View History

[[query-dsl-terms-query]]
=== Terms Query
Filters documents that have fields that match any of the provided terms
(*not analyzed*). For example:
[source,js]
--------------------------------------------------
{
"constant_score" : {
"filter" : {
"terms" : { "user" : ["kimchy", "elasticsearch"]}
}
}
}
--------------------------------------------------
The `terms` query is also aliased with `in` as the filter name for
simpler usage deprecated[5.0.0,use `terms` instead].
[float]
[[query-dsl-terms-lookup]]
===== Terms lookup mechanism
When it's needed to specify a `terms` filter with a lot of terms it can
be beneficial to fetch those term values from a document in an index. A
concrete example would be to filter tweets tweeted by your followers.
Potentially the amount of user ids specified in the terms filter can be
a lot. In this scenario it makes sense to use the terms filter's terms
lookup mechanism.
The terms lookup mechanism supports the following options:
[horizontal]
`index`::
The index to fetch the term values from. Defaults to the
current index.
`type`::
The type to fetch the term values from.
`id`::
The id of the document to fetch the term values from.
`path`::
The field specified as path to fetch the actual values for the
`terms` filter.
`routing`::
A custom routing value to be used when retrieving the
external terms doc.
The values for the `terms` filter will be fetched from a field in a
document with the specified id in the specified type and index.
Internally a get request is executed to fetch the values from the
specified path. At the moment for this feature to work the `_source`
needs to be stored.
Also, consider using an index with a single shard and fully replicated
across all nodes if the "reference" terms data is not large. The lookup
terms filter will prefer to execute the get request on a local node if
possible, reducing the need for networking.
[float]
===== Terms lookup twitter example
[source,js]
--------------------------------------------------
# index the information for user with id 2, specifically, its followers
curl -XPUT localhost:9200/users/user/2 -d '{
"followers" : ["1", "3"]
}'
# index a tweet, from user with id 2
curl -XPUT localhost:9200/tweets/tweet/1 -d '{
"user" : "2"
}'
# search on all the tweets that match the followers of user 2
curl -XGET localhost:9200/tweets/_search -d '{
"query" : {
"terms" : {
"user" : {
"index" : "users",
"type" : "user",
"id" : "2",
"path" : "followers"
}
}
}
}'
--------------------------------------------------
The structure of the external terms document can also include array of
inner objects, for example:
[source,js]
--------------------------------------------------
curl -XPUT localhost:9200/users/user/2 -d '{
"followers" : [
{
"id" : "1"
},
{
"id" : "2"
}
]
}'
--------------------------------------------------
In which case, the lookup path will be `followers.id`.