def _hybrid_search_query(
        self,
        text_field: str,
        query_str: str,
        vector_field: str,
        query_embedding: List[float],
        k: int,
        filter_type: str,
        nprobe: str,
        reorder_factor: str,
        filters: Optional[MetadataFilters] = None,
    ) -> Dict:
        """
        Do hybrid search.

        Args:
            text_field(str): Document field to query.
            query_str(str): Query string.
            vector_field(str): Document field embeddings are stored in.
            query_embedding(List[float]): Vector embedding to query.
            k(int): Maximum number of results.
            filter_type(str): filter_type for lindorm search, pre_filter and post_filter are supported;
                default: "post_filter".
            nprobe (str): number of cluster units to query; between 1 and method.parameters.nlist.
                No default value.
            reorder_factor (str): reorder_factor for lindorm search; between 1 and 200; default: 10.

        Optional Args:
            filters(Optional[MetadataFilters]): Optional filters to apply before the search.
                Supports filter-context queries documented at
                https://opensearch.org/docs/latest/query-dsl/query-filter-context/

        Returns:
            Up to k targets closest to query_embedding

        """
        knn_query = self._knn_search_query(
            vector_field=vector_field,
            filter_type=filter_type,
            nprobe=nprobe,
            reorder_factor=reorder_factor,
            query_embedding=query_embedding,
            k=k,
            filters=filters,
        )
        lexical_query = self._lexical_search_query(text_field, query_str, k, filters)

        # Combine knn and lexical search query
        knn_field_query = knn_query["query"]["knn"][vector_field]
        if "filter" not in knn_field_query:
            knn_field_query["filter"] = {"bool": {"must": []}}
        elif "bool" not in knn_field_query["filter"]:
            knn_field_query["filter"]["bool"] = {"must": []}
        elif "must" not in knn_field_query["filter"]["bool"]:
            knn_field_query["filter"]["bool"]["must"] = []

        knn_query["query"]["knn"][vector_field]["filter"]["bool"]["must"].append(
            lexical_query["query"]["bool"]["must"]
        )

        return {
            "size": k,
            "query": knn_query["query"],
            "ext": {
                "lvector": {
                    "filter_type": filter_type,
                    "nprobe": nprobe,
                    "reorder_factor": reorder_factor,
                }
            },
        }

        Do hybrid search.

        Args:
            text_field(str): Document field to query.
            query_str(str): Query string.
            vector_field(str): Document field embeddings are stored in.
            query_embedding(List[float]): Vector embedding to query.
            k(int): Maximum number of results.
            filter_type(str): filter_type for lindorm search, pre_filter and post_filter are supported;
                default: "post_filter".
            nprobe (str): number of cluster units to query; between 1 and method.parameters.nlist.
                No default value.
            reorder_factor (str): reorder_factor for lindorm search; between 1 and 200; default: 10.

        Optional Args:
            filters(Optional[MetadataFilters]): Optional filters to apply before the search.
                Supports filter-context queries documented at
                https://opensearch.org/docs/latest/query-dsl/query-filter-context/

        Returns:
            Up to k targets closest to query_embedding

        
llama-index-integrations/vector_stores/llama-index-vector-stores-lindorm/llama_index/vector_stores/lindorm/base.py