能否不使用indexers在Azure Cognitive Search中为文件建立索引?
直接推送PDF/DOCX/HTML文件到Azure Cognitive Search(不使用Indexer)
完全可以不依赖Indexer,直接通过Push API完成这类文件的索引操作——但不能直接推送字节数组,因为Azure Cognitive Search的Push API仅接受结构化JSON数据,不会自动解析二进制文件内容。你需要先在本地或应用服务中完成文件内容的提取,再将文本与元数据组装成符合索引结构的JSON后提交。
具体操作步骤:
创建匹配的索引结构
先在Azure Cognitive Search中创建包含必要字段的索引,示例字段配置:id:必填唯一标识符(字符串类型)fileName:文件名(字符串)fileType:文件类型(字符串)content:提取的文件文本内容(可搜索字符串类型)- 可选元数据字段:
lastModified(日期类型)、fileSize(数值类型)等
提取文件文本内容
根据文件类型选择对应工具库提取纯文本或结构化内容:- PDF:使用iTextSharp、PdfSharp或Azure Form Recognizer SDK(需提取结构化数据时)
- DOCX:使用Open XML SDK或DocX库
- HTML:使用HtmlAgilityPack提取纯文本,或保留结构化标签(按需选择)
示例C#代码片段:
// 提取PDF文本(iTextSharp) private string ExtractPdfText(string filePath) { using (var reader = new iTextSharp.text.pdf.PdfReader(filePath)) { var textBuilder = new StringBuilder(); for (int page = 1; page <= reader.NumberOfPages; page++) { textBuilder.Append(iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(reader, page)); } return textBuilder.ToString(); } } // 提取DOCX文本(Open XML SDK) private string ExtractDocxText(string filePath) { using (var doc = WordprocessingDocument.Open(filePath, false)) { return doc.MainDocumentPart.Document.Body.InnerText; } } // 提取HTML纯文本(HtmlAgilityPack) private string ExtractHtmlText(string filePath) { var htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.Load(filePath); return htmlDoc.DocumentNode.InnerText; }组装并推送JSON数据
将提取的文本与元数据组装成符合索引结构的对象,通过Azure Cognitive Search官方SDK(如Azure.Search.Documents)调用Push API提交:示例C#代码片段:
// 初始化搜索客户端 var searchClient = new SearchClient( new Uri("你的搜索服务URL"), "目标索引名称", new AzureKeyCredential("你的管理员API密钥") ); // 组装待推送文档 var targetFile = "path/to/your/file.pdf"; var document = new { id = Guid.NewGuid().ToString(), fileName = Path.GetFileName(targetFile), fileType = Path.GetExtension(targetFile).TrimStart('.'), content = ExtractPdfText(targetFile), lastModified = File.GetLastWriteTime(targetFile) }; // 批量上传文档(支持单次推送多个) var batch = IndexDocumentsBatch.Upload(new[] { document }); var result = await searchClient.IndexDocumentsAsync(batch); // 处理推送结果 if (result.Results.Any(r => r.Status != IndexDocumentsResultStatus.Succeeded)) { // 针对失败文档做重试或日志记录 }
注意事项:
- 大文件建议分块处理,避免单个请求超出API限制
- 若需提取PDF中的表格、表单等结构化数据,可先通过Azure Form Recognizer解析,再将结构化数据写入索引字段
- 确保使用的API密钥拥有目标索引的写入权限(管理员密钥或自定义权限密钥)
内容的提问来源于stack exchange,提问作者TKharaishvili
相关产品推荐
相关产品推荐

