Busca híbrida: resultados combinados de texto completo e ELSER

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.

Próximo

Conclusão

Pronto para criar buscas de última geração?

Uma pesquisa suficientemente avançada não se consegue apenas com o esforço de uma só pessoa. O Elasticsearch é impulsionado por cientistas de dados, especialistas em operações de aprendizado de máquina, engenheiros e muitos outros que são tão apaixonados por buscas quanto você. Vamos nos conectar e trabalhar juntos para construir a experiência de busca mágica que lhe trará os resultados desejados.

Experimente você mesmo(a)