Class SingleValueQuery.SyntheticSourceDelegateBuilder

All Implemented Interfaces:
NamedWriteable, VersionedNamedWriteable, Writeable, QueryBuilder, Rewriteable<QueryBuilder>, org.elasticsearch.xcontent.ToXContent, org.elasticsearch.xcontent.ToXContentObject
Enclosing class:
SingleValueQuery

public static class SingleValueQuery.SyntheticSourceDelegateBuilder extends SingleValueQuery.AbstractBuilder
Builds a bool query ANDing the "next" query, a SingleValueMatchQuery, and a TermQuery making sure we didn't ignore any values. Three total queries. This is only used if the "next" query matches fields that would not be ignored. Read all the paragraphs below to understand it. It's tricky!

This is used in the case when you do text_field == "foo" and text_field has a keyword sub-field. See, text typed fields can't do our equality - they only do matching. But keyword fields *can* do the equality. In this case the "next" query is a TermQuery like text_field.raw:foo.

But there's a big wrinkle! If you index a field longer than ignore_above into text_field.raw field then it'll drop its value on the floor. So the SingleValueMatchQuery isn't enough to emulate ==. You have to remove any matches that ignored a field. Luckily we have IgnoredFieldMapper! We can do a TermQuery like NOT(_ignored:text_field.raw) to filter those out.

You may be asking, "how would the first text_field.raw:foo query work if the value we're searching for is very long?" In that case we never use this query at all. We have to delegate the filtering to the compute engine. No fancy lucene searches in that case.