| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | [[query-dsl-terms-query]]=== Terms QueryFilters documents that have fields that match any of the provided terms(*not analyzed*). For example:[source,js]--------------------------------------------------GET /_search{    "query": {        "constant_score" : {            "filter" : {                "terms" : { "user" : ["kimchy", "elasticsearch"]}            }        }    }}--------------------------------------------------// CONSOLEThe `terms` query is also aliased with `in` as the filter name forsimpler usage deprecated[5.0.0,use `terms` instead].[float][[query-dsl-terms-lookup]]===== Terms lookup mechanismWhen it's needed to specify a `terms` filter with a lot of terms it canbe beneficial to fetch those term values from a document in an index. Aconcrete example would be to filter tweets tweeted by your followers.Potentially the amount of user ids specified in the terms filter can bea lot. In this scenario it makes sense to use the terms filter's termslookup 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 adocument with the specified id in the specified type and index.Internally a get request is executed to fetch the values from thespecified 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 replicatedacross all nodes if the "reference" terms data is not large. The lookupterms filter will prefer to execute the get request on a local node ifpossible, reducing the need for networking.[float]===== Terms lookup twitter exampleAt first we index the information for user with id 2, specifically, itsfollowers, than index a tweet from user with id 1. Finally we search onall the tweets that match the followers of user 2.[source,js]--------------------------------------------------PUT /users/user/2{    "followers" : ["1", "3"]}PUT /tweets/tweet/1{    "user" : "1"}GET /tweets/_search{    "query" : {        "terms" : {            "user" : {                "index" : "users",                "type" : "user",                "id" : "2",                "path" : "followers"            }        }    }}--------------------------------------------------// CONSOLEThe structure of the external terms document can also include array ofinner 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`.
 |