Query DSL
Join query
The join filter enables the filtering of one set of documents (the target) with another one (the source) based on
shared field values. It accepts the following parameters:
typeThe type of the join algorithm to use. Valid values are either
BROADCAST_JOIN,HASH_JOINorMERGE_JOIN. If this parameter is not specified, the query planner will try to automatically select the optimal one.indicesThe index names that will be joined with the source indices. Defaults to all indices.
indicesThe index types that will be joined with the source indices. Defaults to all types.
onAn array specifying the field paths for join keys in both source and target indices. Both fields must have the same datatype with the parameter
doc_valuesset to true. You should not join fields based on thetextdatatype.requestThe search request that will be used to compute the set of documents on the source before performing the join.
Example
In this example, we will join all the documents from index1 with the documents of index2 using the HASH_JOIN
algorithm.
The query first filters documents from index2 and of type type with the query
{ "terms" : { "tag" : [ "aaa" ] } }. It then retrieves the ids of the documents from the field id
specified by the parameter on. The list of ids is then used as filter and applied on the field
foreign_key of the documents from index1.
GET /siren/index1/_search
{
"join" : {
"type": "HASH_JOIN",
"indices" : ["index2"],
"types" : ["type"],
"on" : ["foreign_key", "id"],
"request" : {
"query" : {
"terms" : {
"tag" : [ "aaa" ]
}
}
}
}
}Scoring capabilities
The join filter has not scoring support and will return a constant score.
Compatibility with nested query
The join filter within a nested query is currently supported. The join key must specify
the field path within the scope of the nested object. For example, as shown below, the join key must be foreign_key
and not nested_obj.foreign_key.
GET /siren/index1/_search
{
"nested" : {
"path" : "nested_obj",
"query" : {
"join" : {
"indices" : ["index2"],
"types" : ["type"],
"on" : ["foreign_key", "id"],
"request" : {
"query" : {
"match_all" : {}
}
}
}
}
}
}A nested query within a join filter is also supported if and only if the join key does not refer to
a field of the nested object.