private buildQuery()

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"
                  }
                }
              ]
            }
          : {})
      }
    };
  }