Skip to content

DSL Compatibility Matrix

export const N = () => (<span style={{backgroundColor: ‘#16a34a’, color: ‘#fff’, borderRadius: ‘4px’, padding: ‘1px 7px’, fontSize: ‘0.78em’, fontWeight: 700, letterSpacing: ‘0.5px’}}>N); export const T = () => (<span style={{backgroundColor: ‘#2563eb’, color: ‘#fff’, borderRadius: ‘4px’, padding: ‘1px 7px’, fontSize: ‘0.78em’, fontWeight: 700, letterSpacing: ‘0.5px’}}>T); export const P = () => (<span style={{backgroundColor: ‘#d97706’, color: ‘#fff’, borderRadius: ‘4px’, padding: ‘1px 7px’, fontSize: ‘0.78em’, fontWeight: 700, letterSpacing: ‘0.5px’}}>P); export const F = () => (<span style={{backgroundColor: ‘#9333ea’, color: ‘#fff’, borderRadius: ‘4px’, padding: ‘1px 7px’, fontSize: ‘0.78em’, fontWeight: 700, letterSpacing: ‘0.5px’}}>F); export const X = () => (<span style={{backgroundColor: ‘#d1d5db’, color: ‘#6b7280’, borderRadius: ‘4px’, padding: ‘1px 7px’, fontSize: ‘0.78em’, fontWeight: 700, letterSpacing: ‘0.5px’}}>N/A);

This page is the support map for the DSL Query API: for every query type, aggregation, and option, it shows how faithfully each search engine backend (Elasticsearch, Solr, Lucene) implements it. Because Viglet Turing exposes one Elasticsearch-compatible syntax over three different engines, a feature that’s native on one may be translated or only partially supported on another.

Reach for this table when you’re choosing a backend for a site, or when a DSL query behaves differently than you expected across engines: the badge tells you whether that’s a 1:1 mapping, a translation, or a best-effort approximation. Read it alongside the query examples on the DSL Query API page.

Badge Level Description
Native Direct 1:1 mapping to the engine API
Translated Converted to equivalent engine syntax

Partial Basic support with limitations
Fallback Best-effort approximation
N/A Not supported by the engine

Query ES Solr Lucene
match
multi_match
match_phrase
match_phrase_prefix
match_bool_prefix
combined_fields
query_string
simple_query_string
match_all
Query ES Solr Lucene
term
terms
terms_set
range
exists
prefix
wildcard
regexp
fuzzy
ids
Query ES Solr Lucene
bool
constant_score
dis_max
boosting
function_score

script_score
pinned
Query ES Solr Lucene
nested
has_child
has_parent
Query ES Solr Lucene
geo_distance
geo_bounding_box
geo_shape
Query ES Solr Lucene
knn
Query ES Solr Lucene
span_term
span_near
span_or
span_not
span_first
Query ES Solr Lucene
more_like_this
intervals
rank_feature
distance_feature
wrapper
percolate

Aggregation ES Solr Lucene
terms
range
date_histogram
histogram
filter
filters
significant_terms
rare_terms

nested
reverse_nested
auto_date_histogram
multi_terms
composite
sampler
diversified_sampler
adjacency_matrix
geo_distance
variable_width_histogram
Aggregation ES Solr Lucene
avg
sum
min
max
cardinality
value_count
stats
extended_stats
percentiles
percentile_ranks
top_hits
top_metrics
median_absolute_deviation
boxplot
string_stats
matrix_stats
t_test
rate
scripted_metric
geo_bounds
geo_centroid

Feature ES Solr Lucene
from / size
sort
_source
highlight
aggs
post_filter
min_score

search_after
collapse
suggest

rescore

timeout
explain
script_fields
indices_boost
track_total_hits
stored_fields
scroll
profile
pit
docvalue_fields
version
seq_no_primary_term
preference
routing
terminate_after

Field ES Solr Lucene
took
timed_out
hits.total
hits.max_score
hits._id
hits._score
hits._source
hits.highlight
hits._explanation
hits.fields
hits._version
hits._seq_no
hits.sort
aggregations
suggest
_scroll_id
profile
_shards

Category Total ES Solr Lucene
Queries 40 100% 100% 100%
Aggregations 35 100% 49% 31%
Request Features 29 100% 41% 21%
Response Fields 18 100% 44% 44%

Use Case Recommended
Full Elasticsearch DSL compatibility Elasticsearch
Production enterprise search with Solr infrastructure Solr
Embedded search without external dependencies Lucene
Vector / semantic search (knn) ES or Lucene
Advanced aggregations (composite, nested, geo) Elasticsearch
Simple faceted search with metric aggs Solr or Lucene

Content AI is a federated, read-only index whose query language is Adobe’s own: a filter DSL plus semantic and keyword queries, not Lucene syntax. So rather than approximate the whole Elasticsearch surface, Turing translates a defined subset and refuses the rest by name, with 501 Not Implemented:

Query / feature Content AI Notes
match_all NOT exists(...) over a reserved field name: an empty filter group is invalid in Adobe’s schema
match A scoring fulltext query
term StringFilter, NumberFilter or BooleanFilter, chosen from the value’s type
terms InFilter
range An AND of one-sided NumberFilter / DateFilter bounds
exists ExistsFilter
prefix PrefixFilter
bool

Text clauses become the arms of a composite; the rest becomes one filter group used as their pre-filter. minimum_should_match > 1 and a must_not over a text query are refused
terms aggregation termBuckets
Sorting orderBy; _score is dropped, since Adobe already sorts by descending score
size

Capped at 50 by the API
from (offset) Adobe paginates by opaque cursor; a non-zero from is refused rather than answered with page one
Everything else knn, nested, geo, function_score, span, join queries, other aggregations

Why refuse rather than approximate. A clause quietly dropped because it could not be translated would leave a query that still runs, and answers confidently from the wrong set of documents. A 501 naming the clause is a worse response and a better answer.

This subset is what the vectorless copilot needs, which is the point: that surface needs no embeddings, so it is the grounded-answer path that suits a federated index, and it runs entirely through this API.