Como indexar blobs e arquivos para produzir vários documentos de pesquisa
Aplica-se a: Indexadores de blobs, Indexares de arquivos
Por padrão, um indexador trata o conteúdo de um blob ou arquivo como um único documento de pesquisa. Se você quiser uma representação mais granular em um índice de pesquisa, poderá definir valores de parsingMode para criar vários documentos de pesquisa por meio de um blob ou arquivo. Os valores de parsingMode que resultam em muitos documentos de pesquisa incluem delimitedText
(para CSV), e jsonArray
ou jsonLines
(para JSON).
Quando você usa qualquer um desses modos de análise, os novos documentos de pesquisa que surgem precisam ter chaves de documento exclusivas e um problema surge na determinação do local de origem desse valor. O blob pai tem pelo menos um valor exclusivo na forma de metadata_storage_path property
, mas se ele contribuir com esse valor em mais de um documento de pesquisa, a chave não será mais exclusiva no índice.
Para resolver esse problema, o indexador de blob gera um AzureSearch_DocumentKey
que identifica exclusivamente cada documento de pesquisa filho criado por um blob pai. Este artigo explica como esse recurso funciona.
Chave de documento de um para muitos
Cada documento em um índice é identificado exclusivamente por uma chave de documento. Quando nenhum modo de análise for especificado e se não houver nenhum mapeamento de campo explícito na definição do indexador para a chave do documento de pesquisa, o indexador de blob mapeará automaticamente o metadata_storage_path property
como a chave do documento. Este mapeamento padrão garante que cada blob apareça como um documento de pesquisa distinto e poupa de você a etapa de ter que criar esse mapeamento de campo por conta própria (normalmente, apenas campos com nomes e tipos idênticos são mapeados automaticamente).
Em um cenário de documento de pesquisa um para muitos, uma chave de documento implícita baseada em metadata_storage_path property
não é possível. Como alternativa, a Pesquisa de IA do Azure pode gerar uma chave de documento para cada entidade individual extraída de um blob. A chave gerada é denominada AzureSearch_DocumentKey
e adicionada a cada documento de pesquisa. O indexador controla os "muitos documentos" criados a partir de cada blob e pode direcionar atualizações para o índice de pesquisa quando os dados de origem são alterados ao longo do tempo.
Por padrão, quando nenhum mapeamento de campo explícito para o campo de índice de chave for especificado, o AzureSearch_DocumentKey
será mapeado para ele, usando a função de mapeamento de campo base64Encode
.
Exemplo
Suponha uma definição de índice com os seguintes campos:
id
temperature
pressure
timestamp
E o seu contêiner de blobs tem blobs com a seguinte estrutura:
Blob1.json
{ "temperature": 100, "pressure": 100, "timestamp": "2024-02-13T00:00:00Z" }
{ "temperature" : 33, "pressure" : 30, "timestamp": "2024-02-14T00:00:00Z" }
Blob2.json
{ "temperature": 1, "pressure": 1, "timestamp": "2023-01-12T00:00:00Z" }
{ "temperature" : 120, "pressure" : 3, "timestamp": "2022-05-11T00:00:00Z" }
Quando você cria um indexador e define o parsingMode como jsonLines
– sem especificar nenhum mapeamento de campo explícito para o campo de chave, o mapeamento a seguir é aplicado implicitamente.
{
"sourceFieldName" : "AzureSearch_DocumentKey",
"targetFieldName": "id",
"mappingFunction": { "name" : "base64Encode" }
}
Esta configuração resulta em chaves de documento desambiguadas, semelhantes à ilustração a seguir (ID codificada em base64 abreviada para brevidade).
ID | temperatura | pressão | timestamp |
---|---|---|---|
aHR0 ... YjEuanNvbjsx | 100 | 100 | 2024-02-13T00:00:00Z |
aHR0 ... YjEuanNvbjsy | 33 | 30 | 2024-02-14T00:00:00Z |
aHR0 ... YjIuanNvbjsx | 1 | 1 | 2023-01-12T00:00:00Z |
aHR0 ... YjIuanNvbjsy | 120 | 3 | 2022-05-11T00:00:00Z |
Mapeamento de campo personalizado do campo de chave de índice
Considerando que o índice tenha a mesma definição do exemplo anterior, suponha que o seu contêiner de blobs tenha blobs com a seguinte estrutura:
Blob1.json
recordid, temperature, pressure, timestamp
1, 100, 100,"2024-02-13T00:00:00Z"
2, 33, 30,"2024-02-14T00:00:00Z"
Blob2.json
recordid, temperature, pressure, timestamp
1, 1, 1,"20123-01-12T00:00:00Z"
2, 120, 3,"2022-05-11T00:00:00Z"
Quando você cria um indexador com delimitedText
parsingMode, pode parecer natural configurar uma função de mapeamento de campo para o campo de chave da seguinte maneira:
{
"sourceFieldName" : "recordid",
"targetFieldName": "id"
}
No entanto, esse mapeamento não resultará em quatro documentos aparecendo no índice porque o campo recordid
não é exclusivo entre blobs. Portanto, é recomendável que você use o mapeamento de campo implícito aplicado da propriedade AzureSearch_DocumentKey
para o campo de índice de chave nos modos de análise "um para muitos".
Se você quiser configurar um mapeamento de campo explícito, verifique se o sourceField é diferente para cada entidade individual em todos os blobs.
Observação
A abordagem usada pelo AzureSearch_DocumentKey
de assegurar a exclusividade por entidade extraída está sujeita a alterações e, portanto, você não deve depender do valor dela para as necessidades do seu aplicativo.
Especificar o campo de chave de índice em seus dados
Supondo que a mesma definição de índice do exemplo anterior e parsingMode seja definido jsonLines
sem especificar nenhum mapeamento de campo explícito para que os mapeamentos se pareçam com o primeiro exemplo, suponha que seu contêiner de blob tenha blobs com a seguinte estrutura:
Blob1.json
id, temperature, pressure, timestamp
1, 100, 100,"2024-02-13T00:00:00Z"
2, 33, 30,"2024-02-14T00:00:00Z"
Blob2.json
id, temperature, pressure, timestamp
1, 1, 1,"2023-01-12T00:00:00Z"
2, 120, 3,"2022-05-11T00:00:00Z"
Observe que cada documento contém o campo id
, que é definido como o campo key
no índice. Nesse caso, mesmo que um documento exclusivo AzureSearch_DocumentKey
seja gerado, ele não será usado como a "chave" para o documento. Em vez disso, o valor do campo id
será mapeado para o campo key
Semelhante ao exemplo anterior, esse mapeamento não resultará em quatro documentos aparecendo no índice porque o campo id
não é exclusivo entre blobs. Quando esse for o caso, qualquer entrada json que especificar um id
resultará em uma mesclagem no documento existente em vez de um upload de um novo documento, e o estado do índice refletirá a entrada de leitura mais recente com o id
especificado.
Próximas etapas
Se você ainda não estiver familiarizado com a estrutura básica e o fluxo de trabalho da indexação de blobs, examine primeiro a Indexação do Armazenamento de Blobs do Azure com o Azure AI Search. Para obter mais informações sobre os modos de análise de diferentes tipos de conteúdo de blob, examine os artigos a seguir.