Fix doc.MetaFields undefined (#16976)

Follow on #16929
This commit is contained in:
Wang Qi
2026-07-16 13:27:08 +08:00
committed by GitHub
parent d577b49a00
commit 46e14fe52b
2 changed files with 34 additions and 5 deletions

View File

@@ -55,6 +55,7 @@ type ModelServiceIface interface {
// MetadataServiceIface abstracts MetadataService for the Dify handler.
type MetadataServiceIface interface {
GetFlattedMetaByKBs(kbIDs []string) (common.MetaData, error)
SearchMetadataByKBs(kbIDs []string, size int) (*service.SearchMetadataResponse, error)
LabelQuestion(question string, kbs []*entity.Knowledgebase) map[string]float64
}
@@ -333,6 +334,21 @@ func (h *DifyRetrievalHandler) Retrieval(c *gin.Context) {
}
}
metaMap := make(map[string]map[string]interface{})
metaResult, err := h.metadataSvc.SearchMetadataByKBs([]string{kb.ID}, 10000)
if err == nil {
for _, metadata := range metaResult.MetadataRecords {
docID, ok := service.ExtractDocumentID(metadata)
if !ok {
continue
}
metaFields, err := service.ExtractMetaFields(metadata)
if err == nil {
metaMap[docID] = metaFields
}
}
}
// Build response
records := make([]difyRecord, 0, len(chunks))
for _, ch := range chunks {
@@ -346,8 +362,8 @@ func (h *DifyRetrievalHandler) Retrieval(c *gin.Context) {
delete(ch, "vector")
meta := make(map[string]interface{})
if doc.MetaFields != nil {
for k, v := range *doc.MetaFields {
if metaFields := metaMap[docID]; metaFields != nil {
for k, v := range metaFields {
meta[k] = v
}
}

View File

@@ -31,6 +31,7 @@ import (
"ragflow/internal/engine/types"
"ragflow/internal/entity"
modelModule "ragflow/internal/entity/models"
"ragflow/internal/service"
"ragflow/internal/service/nlp"
"github.com/gin-gonic/gin"
@@ -82,8 +83,9 @@ func (m *mockModelService) GetChatModel(tenantID, llmID string) (*modelModule.Ch
type mockMetadataService struct {
MetadataServiceIface
getFlattedMetaFn func(kbIDs []string) (common.MetaData, error)
labelQuestionFn func(question string, kbs []*entity.Knowledgebase) map[string]float64
getFlattedMetaFn func(kbIDs []string) (common.MetaData, error)
searchMetadataByKBs func(kbIDs []string, size int) (*service.SearchMetadataResponse, error)
labelQuestionFn func(question string, kbs []*entity.Knowledgebase) map[string]float64
}
func (m *mockMetadataService) GetFlattedMetaByKBs(kbIDs []string) (common.MetaData, error) {
@@ -93,6 +95,17 @@ func (m *mockMetadataService) GetFlattedMetaByKBs(kbIDs []string) (common.MetaDa
return common.MetaData{}, nil
}
func (m *mockMetadataService) SearchMetadataByKBs(kbIDs []string, size int) (*service.SearchMetadataResponse, error) {
if m.searchMetadataByKBs != nil {
return m.searchMetadataByKBs(kbIDs, size)
}
return &service.SearchMetadataResponse{
MetadataRecords: []map[string]interface{}{
{"id": "doc1", "meta_fields": map[string]interface{}{"author": "Zhang San"}},
},
}, nil
}
func (m *mockMetadataService) LabelQuestion(question string, kbs []*entity.Knowledgebase) map[string]float64 {
if m.labelQuestionFn != nil {
return m.labelQuestionFn(question, kbs)
@@ -126,7 +139,7 @@ func (m *mockDocDAO) GetByIDs(ids []string) ([]*entity.Document, error) {
return m.getByIDsFn(ids)
}
return []*entity.Document{
{ID: "doc1", Name: strPtr("Test Doc"), MetaFields: &entity.JSONMap{"author": "Zhang San"}},
{ID: "doc1", Name: strPtr("Test Doc")},
}, nil
}