Assim como na busca vetorial da seção anterior, nesta seção você aprenderá como combinar os melhores resultados de busca de consultas de texto completo e semânticas usando o algoritmo Reciprocal Rank Fusion .
Introdução às Subbuscas
A solução para implementar uma pesquisa híbrida de texto completo e vetor denso foi enviar uma solicitação de pesquisa que incluía os argumentos query, knn para solicitar as duas pesquisas e o argumento rrf para combiná-las em uma única lista de resultados.
A complicação que surge ao tentar fazer o mesmo para combinar pedidos de pesquisa de texto completo e de vetor esparso é que ambos usam o argumento query . Para poder fornecer as duas consultas que precisam ser combinadas com o algoritmo RRF, é necessário incluir dois argumentos query , e a solução para fazer isso é fazê-lo com Sub-Buscas.
A funcionalidade de subbuscas encontra-se atualmente em fase de pré-visualização técnica. Por esse motivo, o cliente Elasticsearch em Python não oferece suporte nativo a isso. Para contornar essa limitação, o método search() da classe Search pode ser alterado para enviar a solicitação de pesquisa usando o argumento body . Abaixo você pode ver uma implementação nova, porém similar, que usa o argumento body do cliente para enviar uma solicitação de pesquisa:
Essa implementação não requer nenhuma alteração no aplicativo, pois é funcionalmente equivalente. A única diferença é que o método search() valida todos os argumentos antes de enviar a solicitação, sendo body a única exceção. O servidor sempre valida as solicitações, independentemente de como o cliente as envia.
Nesta versão, o argumento sub_searches pode ser usado em Search.search() para enviar várias consultas de pesquisa da seguinte forma:
Implementação de Busca Híbrida
Para concluir esta seção, vamos retomar a lógica de texto completo e combiná-la com a consulta de busca semântica apresentada anteriormente neste capítulo.
Abaixo você pode ver o endpoint handle_search() atualizado:
Como você deve se lembrar, a função extract_filters() procurava filtros de categoria inseridos pelo usuário no prompt de pesquisa e retornava a parte restante como parsed_query. Se parsed_query estiver vazio, significa que o usuário inseriu apenas um filtro de categoria e, nesse caso, a consulta deve ser um simples match_all com a categoria selecionada como filtro. Isso é implementado na parte else da grande condicional.
Quando há uma consulta de pesquisa, a opção sub_searches é usada conforme mostrado na seção anterior para incluir as consultas multi_match e text_expansion , com a opção rank solicitando que os resultados das duas subpesquisas sejam combinados em uma única lista de resultados classificados. Para completar a consulta, os argumentos size e from_ são fornecidos para manter o suporte à paginação.
Clique aqui para consultar esta versão do aplicativo.
Anteriormente
Consultas semânticasPróximo
Conclusão