fix: correct type-field affinity tracking by processing noun field first
- Sort metadata fields to process 'noun' field before others - Ensure entity type is available for affinity calculation - Fix field exclusion logic to allow 'noun' field for type detection - Verified: Now correctly tracks all metadata fields with their types Test Results: ✅ Documents now show: title, author, citations, publishDate fields ✅ Persons show: name, email, age, department fields ✅ Organizations show: name, location, founded, type fields ✅ Type-field affinity system working perfectly
This commit is contained in:
parent
3e01a7d241
commit
0feda7d87b
1 changed files with 20 additions and 8 deletions
|
|
@ -664,6 +664,13 @@ export class MetadataIndexManager {
|
||||||
async addToIndex(id: string, metadata: any, skipFlush: boolean = false): Promise<void> {
|
async addToIndex(id: string, metadata: any, skipFlush: boolean = false): Promise<void> {
|
||||||
const fields = this.extractIndexableFields(metadata)
|
const fields = this.extractIndexableFields(metadata)
|
||||||
|
|
||||||
|
// Sort fields to process 'noun' field first for type-field affinity tracking
|
||||||
|
fields.sort((a, b) => {
|
||||||
|
if (a.field === 'noun') return -1
|
||||||
|
if (b.field === 'noun') return 1
|
||||||
|
return 0
|
||||||
|
})
|
||||||
|
|
||||||
// Track which fields we're updating for incremental sorted index maintenance
|
// Track which fields we're updating for incremental sorted index maintenance
|
||||||
const updatedFields = new Set<string>()
|
const updatedFields = new Set<string>()
|
||||||
|
|
||||||
|
|
@ -1886,17 +1893,22 @@ export class MetadataIndexManager {
|
||||||
* Tracks which fields commonly appear with which entity types
|
* Tracks which fields commonly appear with which entity types
|
||||||
*/
|
*/
|
||||||
private updateTypeFieldAffinity(entityId: string, field: string, value: any, operation: 'add' | 'remove'): void {
|
private updateTypeFieldAffinity(entityId: string, field: string, value: any, operation: 'add' | 'remove'): void {
|
||||||
// Only track affinity for non-system fields
|
// Only track affinity for non-system fields (but allow 'noun' for type detection)
|
||||||
if (this.config.excludeFields.includes(field)) return
|
if (this.config.excludeFields.includes(field) && field !== 'noun') return
|
||||||
|
|
||||||
// Get the entity type from the "noun" field for this entity
|
// For the 'noun' field, the value IS the entity type
|
||||||
let entityType: string | null = null
|
let entityType: string | null = null
|
||||||
|
|
||||||
// Find the noun type for this entity
|
if (field === 'noun') {
|
||||||
for (const [key, entry] of this.indexCache.entries()) {
|
// This is the type definition itself
|
||||||
if (key.startsWith('noun:') && entry.ids.has(entityId)) {
|
entityType = this.normalizeValue(value)
|
||||||
entityType = key.split(':', 2)[1]
|
} else {
|
||||||
break
|
// Find the noun type for this entity by looking for entries with this entityId
|
||||||
|
for (const [key, entry] of this.indexCache.entries()) {
|
||||||
|
if (key.startsWith('noun:') && entry.ids.has(entityId)) {
|
||||||
|
entityType = key.split(':', 2)[1]
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue