in packages/search-ui-elasticsearch-connector/src/queryBuilders/SearchQueryBuilder.ts [144:243]
private buildQuery(): SearchRequest["query"] | null {
const filters = (this.state.filters || [])
.filter((filter) => !this.queryConfig.facets[filter.field]) // remove filters that are also facets
.concat(this.queryConfig.filters || []) // add filters from the config and do filter even if they are facets
.map(transformFilter);
const searchQuery = this.state.searchTerm;
if (!searchQuery && !filters?.length) {
return null;
}
const fields = getQueryFields(this.queryConfig.search_fields);
return {
bool: {
...(filters?.length && { filter: filters }),
...(searchQuery && {
must: [
{
bool: {
minimum_should_match: 1,
should: [
{
multi_match: {
query: searchQuery,
fields: fields,
type: "best_fields",
operator: "and"
}
},
{
multi_match: {
query: searchQuery,
fields: fields,
type: "cross_fields"
}
},
{
multi_match: {
query: searchQuery,
fields: fields,
type: "phrase"
}
},
{
multi_match: {
query: searchQuery,
fields: fields,
type: "phrase_prefix"
}
}
]
}
}
]
})
}
};
return {
bool: {
...(filters?.length && { filter: filters }),
...(searchQuery
? {
should: [
{
multi_match: {
query: searchQuery,
fields: fields,
type: "best_fields",
operator: "and"
}
},
{
multi_match: {
query: searchQuery,
fields: fields,
type: "cross_fields"
}
},
{
multi_match: {
query: searchQuery,
fields: fields,
type: "phrase"
}
},
{
multi_match: {
query: searchQuery,
fields: fields,
type: "phrase_prefix"
}
}
]
}
: {})
}
};
}