From 382c237dacd8d643d8f5093766dffe0e36bec902 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Tue, 27 May 2025 04:42:54 +0000 Subject: [PATCH] fix(server): return empty summary field value (#12517) close AF-2658 ## Summary by CodeRabbit - **Tests** - Added new test cases and snapshots to enhance coverage for search results involving empty or missing fields like summary, title, and ref_doc_id. - Verified consistent handling of empty string values and absence of fields across different search providers. - **Bug Fixes** - Improved handling of empty string values for specific fields by converting them to null to ensure consistent search result formatting. --- .../indexer/__snapshots__/search.spec.ts.md | 32 ++++++ .../indexer/__snapshots__/search.spec.ts.snap | Bin 1107 -> 1228 bytes .../src/__tests__/e2e/indexer/search.spec.ts | 84 ++++++++++++++ .../__snapshots__/elasticsearch.spec.ts.md | 49 ++++++++ .../__snapshots__/elasticsearch.spec.ts.snap | Bin 4379 -> 4695 bytes .../__snapshots__/manticoresearch.spec.ts.md | 67 +++++++++++ .../manticoresearch.spec.ts.snap | Bin 5526 -> 5893 bytes .../__tests__/providers/elasticsearch.spec.ts | 107 ++++++++++++++++++ .../providers/manticoresearch.spec.ts | 107 ++++++++++++++++++ .../indexer/providers/manticoresearch.ts | 14 ++- 10 files changed, 459 insertions(+), 1 deletion(-) diff --git a/packages/backend/server/src/__tests__/e2e/indexer/__snapshots__/search.spec.ts.md b/packages/backend/server/src/__tests__/e2e/indexer/__snapshots__/search.spec.ts.md index e975fdabdd..917580376a 100644 --- a/packages/backend/server/src/__tests__/e2e/indexer/__snapshots__/search.spec.ts.md +++ b/packages/backend/server/src/__tests__/e2e/indexer/__snapshots__/search.spec.ts.md @@ -138,3 +138,35 @@ Generated by [AVA](https://avajs.dev). }, }, } + +## should return empty nodes when docId not exists + +> Snapshot 1 + + { + workspace: { + search: { + nodes: [], + pagination: { + count: 0, + hasMore: false, + nextCursor: null, + }, + }, + }, + } + +## should empty doc summary string when doc exists but no summary + +> Snapshot 1 + + [ + { + fields: { + summary: [ + '', + ], + }, + highlights: null, + }, + ] diff --git a/packages/backend/server/src/__tests__/e2e/indexer/__snapshots__/search.spec.ts.snap b/packages/backend/server/src/__tests__/e2e/indexer/__snapshots__/search.spec.ts.snap index ec5c80acce1bdd18574de72bd4210ca3a7864bc6..180402967c4c0ed155927ba9791e9e521af0d176 100644 GIT binary patch literal 1228 zcmV;-1T*_VRzVY00000000B+S51f=0R!T}gNQ#NqIifN{U;C*ym&DFM1por z&umXk_q1*ZC}b|vQ}w>DzM5C>)z@p)`MO^@B3EA#p&Qo4(l%N1TXn~h!VW4mYtapB z*5fS^EW6UPo3iGI^7xwL*r7eg_iz*ueW*ly3czjv_W;;Jg>f?P4FY?asPj}Vmq9}y z1{x-MpdC0&^hEScD#sdtHvqif$x%2se^^vPV%^8Fu`vbx9>7HaS9EBh7doOA93{Gm zfC=ItbDRoQSJWK|Dq{<=&gf9hU8vRFg<2@p5Fbf|-@l>o67d!RD+HV%tx(>#r&9!+ zA>gbIEoSWLyF^hu5LGo;V(WvYKvehpl><&9Xqu%2J(3<&BEG_a;|y41y}TMdyq1W6 z$be56@T~?kH6Z(i0hcvUNeA7)ftz_RXj95j+8j~PExo)lS@r$NS!;6M4yGrM#`8p} zfIA{US{l>wE4NMc1*_p*DunV^PD8a5ceJ)A)>_rAha#{%-wK57SWOW$Tq#}OvmC!7 zE#I?3VK=NrKR6d?&@2ma*MiTIOyDIAG^&H%GJ$tA zP+13kW&-Cm(3lST*#v&oK;ydI^jTt?-N7W9KeQTlSgBdIx2#&l{&zHbEnxxd zb^tTF9;xrlk~%n1=h&%mQ@8h2c_K%6D#rr4d7e+?DYQ#hx{EyIEP$`|L_9-8za{$h9?rjA8OhQu4jj??}17KPqwj-fCB`GSpPjWn0+;H%}vaT-||BBE4tl#=8832 zKIjKR{bpmj4|!rK+}8@EAH+V?p?+r?^=hYW;+51D?_$Z7;dQ?M=X~EC^W7%e@hg^W zH5zuXY{@Wiy@f98G2hmFD~w(fV^j+LwgMg3g9UR%~jit`Sh)A5JymU0wUcp7AO>+8!A}-$Mg=hh42TOCB7TCRtGM+~AmGx4@e>JJ)zv-K zuj``;0T=eBs@^;2-dp|NIq%kHd%5FVN5fOE%gBv7^4QMM@p~QH2&EZVjAG$8OPP|9J1_7r@DU^@B(^&$}6L3L= z)(hV0`%F!6(>&9fZR|aBmFA z3nOgbx^r%foDAQSP^da{9;zRBptZfJ*4l0-l7Zp*Mj%bw=*nQ#4MW%W4BNLt!}p9x znybc|9~=$4rX{ze_*^Q*+Ehl0+5&(@00#gZs*)p5MEJx|j?brZoFqCQ-?C(JzXtFl zfZwZ?xr+dUfcw;4TpNQf5pbA*H5IzOV8freF%f@qWArQ6>jAqNaQENxc#u_jfH=$m z$$%3Kc$oobRZ4w~@+kwpV8A5?{K0@GS13~j|K@JK^*;6F9EdgFAbK=25pUVlKeS{r zEMlF>VKs<8;5mMCnHQNAOpU#v0dH&NhQ>b9fX}oFGy7Hp zE@>5Jc2xsNl$n`M{1yS+CV+hka6$z>DF9ml&nUo2HSLQ6cvS&4RM0yDcuxT}RnV6L zxTt_yD(Ghc{HlPaRl6Cp#Qy5WZd+`arOX0D&Y1Oo=$J@ro-e7nVD8@>FoOo|-2V+) zwK*Rr;1mI`RW@kiT>{=G;41=tBH-FTZPa$M0z2EsN}P7Ni1k7at3h-wud};Y)Y-8s z4EVF6t79`9*u^VMaE=3ec!deZhstB69i2|>2nV{n+yL2W4!pw4%&B!m||?FpTq3CQhwidZN47LoNXLMh(OZMD$xGknnt4hRN_u zM)(t5bH(+{$n`ytUb?fj{RA8&K&JX1sX>g@z!f(Umf!QDD2!sFt diff --git a/packages/backend/server/src/__tests__/e2e/indexer/search.spec.ts b/packages/backend/server/src/__tests__/e2e/indexer/search.spec.ts index ab136518a7..5bce9f5240 100644 --- a/packages/backend/server/src/__tests__/e2e/indexer/search.spec.ts +++ b/packages/backend/server/src/__tests__/e2e/indexer/search.spec.ts @@ -276,3 +276,87 @@ e2e('should return empty results when search not match any docs', async t => { t.snapshot(result); }); + +e2e('should return empty nodes when docId not exists', async t => { + const owner = await app.signup(); + const workspace = await app.create(Mockers.Workspace, { + owner, + }); + + const result = await app.gql({ + query: indexerSearchQuery, + variables: { + id: workspace.id, + input: { + table: SearchTable.doc, + query: { + type: SearchQueryType.match, + field: 'docId', + match: 'not-exists-doc-id', + }, + options: { + fields: ['summary'], + pagination: { + limit: 1, + }, + }, + }, + }, + }); + + t.snapshot(result); +}); + +e2e( + 'should empty doc summary string when doc exists but no summary', + async t => { + const owner = await app.signup(); + const workspace = await app.create(Mockers.Workspace, { + owner, + }); + + const indexerService = app.get(IndexerService); + + await indexerService.write( + SearchTable.doc, + [ + { + docId: 'doc-1-without-summary', + workspaceId: workspace.id, + title: 'test1', + summary: '', + createdByUserId: owner.id, + updatedByUserId: owner.id, + createdAt: new Date('2025-04-22T00:00:00.000Z'), + updatedAt: new Date('2025-04-22T00:00:00.000Z'), + }, + ], + { + refresh: true, + } + ); + + const result = await app.gql({ + query: indexerSearchQuery, + variables: { + id: workspace.id, + input: { + table: SearchTable.doc, + query: { + type: SearchQueryType.match, + field: 'docId', + match: 'doc-1-without-summary', + }, + options: { + fields: ['summary'], + pagination: { + limit: 1, + }, + }, + }, + }, + }); + + t.snapshot(result.workspace.search.nodes); + } +); diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md index d1c77e73b9..ea75f1a483 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md +++ b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md @@ -494,6 +494,55 @@ Generated by [AVA](https://avajs.dev). }, } +## should return empty string field:summary value + +> Snapshot 1 + + [ + { + _id: 'workspaceId-search-query-return-empty-string-field-summary-value-for-elasticsearch/doc0', + _source: { + doc_id: 'doc0', + workspace_id: 'workspaceId-search-query-return-empty-string-field-summary-value-for-elasticsearch', + }, + fields: { + doc_id: [ + 'doc0', + ], + summary: [ + '', + ], + title: [ + '', + ], + }, + highlights: undefined, + }, + ] + +## should not return not exists field:ref_doc_id + +> Snapshot 1 + + [ + { + _id: 'workspaceId-search-query-not-return-not-exists-field-ref_doc_id-for-elasticsearch/doc0/block0', + _source: { + doc_id: 'doc0', + workspace_id: 'workspaceId-search-query-not-return-not-exists-field-ref_doc_id-for-elasticsearch', + }, + fields: { + block_id: [ + 'block0', + ], + doc_id: [ + 'doc0', + ], + }, + highlights: undefined, + }, + ] + ## should aggregate query work > Snapshot 1 diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.snap b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.snap index 97ef5b13df0c81c251f18bcf30c617b4600a5bc8..a98a9c1b9a8a9fc0aff50dfda1e5745e1b0ebe51 100644 GIT binary patch literal 4695 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 ZW}X22T&VW0|4844{|B?1003Oq9u5Ei literal 4379 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 Snapshot 1 { + block_id: [ + '', + ], content: [ 'hello world', ], @@ -29,6 +32,9 @@ Generated by [AVA](https://avajs.dev). > Snapshot 2 { + block_id: [ + '', + ], content: [ 'hello world', ], @@ -43,6 +49,9 @@ Generated by [AVA](https://avajs.dev). > Snapshot 3 { + block_id: [ + '', + ], content: [ 'hello world', ], @@ -239,6 +248,9 @@ Generated by [AVA](https://avajs.dev). blob: [ 'blob1', ], + content: [ + '', + ], flavour: [ 'affine:page', ], @@ -262,6 +274,9 @@ Generated by [AVA](https://avajs.dev). 'blob1', 'blob2', ], + content: [ + '', + ], flavour: [ 'affine:page', ], @@ -284,6 +299,9 @@ Generated by [AVA](https://avajs.dev). blob: [ 'blob3', ], + content: [ + '', + ], flavour: [ 'affine:page', ], @@ -687,6 +705,55 @@ Generated by [AVA](https://avajs.dev). }, ] +## should return empty string field:summary value + +> Snapshot 1 + + [ + { + _id: '274027293861775228', + _source: { + doc_id: 'doc0', + workspace_id: 'workspaceId-search-query-return-empty-string-field-summary-value-for-manticoresearch', + }, + fields: { + doc_id: [ + 'doc0', + ], + summary: [ + '', + ], + title: [ + '', + ], + }, + highlights: undefined, + }, + ] + +## should not return not exists field:ref_doc_id + +> Snapshot 1 + + [ + { + _id: '2457631367295327017', + _source: { + doc_id: 'doc0', + workspace_id: 'workspaceId-search-query-not-return-not-exists-field-ref_doc_id-for-manticoresearch', + }, + fields: { + block_id: [ + 'block0', + ], + doc_id: [ + 'doc0', + ], + }, + highlights: undefined, + }, + ] + ## should aggregate query return top score first > Snapshot 1 diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/manticoresearch.spec.ts.snap b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/manticoresearch.spec.ts.snap index 3a14e99615c1f996fe547046ee4eae4e971f080c..ee2736d98481b08d5a2ae7bc3c3bbf6dab8e708d 100644 GIT binary patch literal 5893 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 Y3am8hO;dB!rgMw`2LP<=i6(LY0EG;DYXATM diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts b/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts index 0d1584f029..3f39b499c2 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts +++ b/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts @@ -1303,6 +1303,113 @@ test('should search doc title support stemmer filter', async t => { t.snapshot(omit(result.nodes[0], ['_score'])); }); +test('should return empty string field:summary value', async t => { + const workspaceId = + 'workspaceId-search-query-return-empty-string-field-summary-value-for-elasticsearch'; + const docId = 'doc0'; + + await searchProvider.write( + SearchTable.doc, + [ + { + workspace_id: workspaceId, + doc_id: docId, + title: '', + summary: '', + created_by_user_id: user.id, + updated_by_user_id: user.id, + created_at: new Date(), + updated_at: new Date(), + }, + ], + { + refresh: true, + } + ); + + let result = await searchProvider.search(SearchTable.doc, { + _source: ['workspace_id', 'doc_id'], + query: { + bool: { + must: [ + { + term: { workspace_id: { value: workspaceId } }, + }, + { + term: { + doc_id: { + value: docId, + }, + }, + }, + ], + }, + }, + fields: ['doc_id', 'title', 'summary'], + sort: ['_score'], + }); + + t.snapshot(result.nodes.map(node => omit(node, ['_score']))); +}); + +test('should not return not exists field:ref_doc_id', async t => { + const workspaceId = + 'workspaceId-search-query-not-return-not-exists-field-ref_doc_id-for-elasticsearch'; + const docId = 'doc0'; + const blockId = 'block0'; + + await searchProvider.write( + SearchTable.block, + [ + { + workspace_id: workspaceId, + doc_id: docId, + block_id: blockId, + content: 'hello world on search title blockId1-text', + flavour: 'affine:text', + created_by_user_id: user.id, + updated_by_user_id: user.id, + created_at: new Date(), + updated_at: new Date(), + }, + ], + { + refresh: true, + } + ); + + let result = await searchProvider.search(SearchTable.block, { + _source: ['workspace_id', 'doc_id'], + query: { + bool: { + must: [ + { + term: { workspace_id: { value: workspaceId } }, + }, + { + term: { + doc_id: { + value: docId, + }, + }, + }, + ], + }, + }, + fields: [ + 'doc_id', + 'block_id', + 'ref_doc_id', + 'parent_block_id', + 'additional', + 'parent_flavour', + ], + sort: ['_score'], + }); + + t.snapshot(result.nodes.map(node => omit(node, ['_score']))); +}); + // #endregion // #region aggregate diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts b/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts index e502aae96e..6ecf13b5b0 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts +++ b/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts @@ -1065,6 +1065,113 @@ test('should search query match ref_doc_id work', async t => { t.is(result.total, 2); }); +test('should return empty string field:summary value', async t => { + const workspaceId = + 'workspaceId-search-query-return-empty-string-field-summary-value-for-manticoresearch'; + const docId = 'doc0'; + + await searchProvider.write( + SearchTable.doc, + [ + { + workspace_id: workspaceId, + doc_id: docId, + title: '', + summary: '', + created_by_user_id: user.id, + updated_by_user_id: user.id, + created_at: new Date(), + updated_at: new Date(), + }, + ], + { + refresh: true, + } + ); + + let result = await searchProvider.search(SearchTable.doc, { + _source: ['workspace_id', 'doc_id'], + query: { + bool: { + must: [ + { + term: { workspace_id: { value: workspaceId } }, + }, + { + term: { + doc_id: { + value: docId, + }, + }, + }, + ], + }, + }, + fields: ['doc_id', 'title', 'summary'], + sort: ['_score'], + }); + + t.snapshot(result.nodes.map(node => omit(node, ['_score']))); +}); + +test('should not return not exists field:ref_doc_id', async t => { + const workspaceId = + 'workspaceId-search-query-not-return-not-exists-field-ref_doc_id-for-manticoresearch'; + const docId = 'doc0'; + const blockId = 'block0'; + + await searchProvider.write( + SearchTable.block, + [ + { + workspace_id: workspaceId, + doc_id: docId, + block_id: blockId, + content: 'hello world on search title blockId1-text', + flavour: 'affine:text', + created_by_user_id: user.id, + updated_by_user_id: user.id, + created_at: new Date(), + updated_at: new Date(), + }, + ], + { + refresh: true, + } + ); + + let result = await searchProvider.search(SearchTable.block, { + _source: ['workspace_id', 'doc_id'], + query: { + bool: { + must: [ + { + term: { workspace_id: { value: workspaceId } }, + }, + { + term: { + doc_id: { + value: docId, + }, + }, + }, + ], + }, + }, + fields: [ + 'doc_id', + 'block_id', + 'ref_doc_id', + 'parent_block_id', + 'additional', + 'parent_flavour', + ], + sort: ['_score'], + }); + + t.snapshot(result.nodes.map(node => omit(node, ['_score']))); +}); + // #endregion // #region aggregate diff --git a/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts b/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts index 47e8698384..9eeb1432bc 100644 --- a/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts +++ b/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts @@ -38,6 +38,15 @@ const SupportIndexedAttributes = [ 'parent_block_id', ]; +const ConvertEmptyStringToNullValueFields = new Set([ + 'ref_doc_id', + 'ref', + 'blob', + 'additional', + 'parent_block_id', + 'parent_flavour', +]); + @Injectable() export class ManticoresearchProvider extends ElasticsearchProvider { override type = SearchProviderType.Manticoresearch; @@ -344,7 +353,10 @@ export class ManticoresearchProvider extends ElasticsearchProvider { return fields.reduce( (acc, field) => { let value = source[field]; - if (value !== null && value !== undefined && value !== '') { + if (ConvertEmptyStringToNullValueFields.has(field) && value === '') { + value = null; + } + if (value !== null && value !== undefined) { // special handle `ref_doc_id`, `ref`, `blob` as string[] if ( (field === 'ref_doc_id' || field === 'ref' || field === 'blob') &&