Estou usando a elasticsearch para indexar meus documentos.
É possível instruí-lo a retornar apenas campos específicos em vez de todo o documento json armazenado?
elasticsearch
user1199438
fonte
fonte
Respostas:
Sim! Use um filtro de origem . Se você estiver pesquisando com JSON, será algo parecido com isto:
No ES 2.4 e versões anteriores, você também pode usar a opção de campos na API de pesquisa :
Isso foi preterido no ES 5+. E os filtros de origem são mais poderosos de qualquer maneira!
fonte
Achei os documentos
get api
úteis - especialmente as duas seções, Filtragem de origem e Campos : https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source- filtragemEles afirmam sobre a filtragem de origem:
O que encaixava perfeitamente no meu caso de uso. Acabei filtrando a fonte assim (usando a abreviação):
Para sua informação, eles informam nos documentos sobre o parâmetro fields :
Parece atender a campos que foram especificamente armazenados, onde coloca cada campo em uma matriz. Se os campos especificados não tiverem sido armazenados, eles buscarão cada um dos _source, o que pode resultar em recuperações 'mais lentas'. Também tive problemas ao tentar fazê-lo retornar campos do tipo objeto.
Portanto, em resumo, você tem duas opções, seja através de filtros de origem ou campos [armazenados].
fonte
fonte
No Elasticsearch 5.x, a abordagem acima mencionada foi descontinuada. Você pode usar a abordagem _source, mas, em certas situações, pode fazer sentido armazenar um campo. Por exemplo, se você possui um documento com um título, uma data e um campo de conteúdo muito grande, convém recuperar apenas o título e a data sem precisar extrair esses campos de um campo _source grande:
Nesse caso, você usaria:
Consulte a documentação sobre como indexar campos armazenados. Sempre feliz por um Upvote!
fonte
fonte
response_filtering
https://stackoverflow.com/a/35647027/844700
fonte
Filtragem de origem
Permite controlar como o campo _source é retornado a cada ocorrência.
A palavra-chave "inclui" define os campos específicos.
fonte
Uma solicitação GET API REST pode ser feita com o parâmetro '_source'.
Solicitação de exemplo
Resposta
}
fonte
Sim, usando o filtro de origem, você pode fazer isso, aqui está o filtro de origem do documento
Solicitação de exemplo
A saída será
fonte
Em java, você pode usar o setFetchSource assim:
fonte
Por exemplo, você tem um documento com três campos:
Se você deseja retornar
name
escore
pode usar o seguinte comando:Se você deseja obter alguns campos que correspondem a um padrão:
Talvez exclua alguns campos:
fonte
Usando a API Java, uso o seguinte para obter todos os registros de um conjunto de campos específicos:
fonte