From 70d4f7b0ede16e6e2339064f668fdade43a2de8e Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 21 Jul 2023 09:46:51 +0200 Subject: [PATCH] fix(search): Lunr result fields highlight Signed-off-by: Camila Belo --- .../src/engines/LunrSearchEngine.test.ts | 29 +++++++++++++++++++ .../src/engines/LunrSearchEngine.ts | 9 ++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts index 27cd65d63b..55c18cd6fc 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts @@ -1145,6 +1145,35 @@ describe('parseHighlightFields', () => { bar: 'ghi <>jkl', }); }); + + it('should filter out non array positions', () => { + expect( + parseHighlightFields({ + preTag: '<>', + postTag: '', + doc: { foo: 'abc def', bar: 'ghi jkl' }, + positionMetadata: { + test: { + foo: { + // invalid position item + position: [null as unknown as number[]], + }, + }, + anotherTest: { + foo: { + position: [[4, 3]], + }, + bar: { + position: [[4, 3]], + }, + }, + }, + }), + ).toEqual({ + foo: 'abc <>def', + bar: 'ghi <>jkl', + }); + }); }); describe('stopword testing', () => { diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index b69b5ea863..ae5a541e81 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -309,8 +309,13 @@ export function parseHighlightFields({ const highlightFieldPositions = Object.values(positionMetadata).reduce( (fieldPositions, metadata) => { Object.keys(metadata).map(fieldKey => { - fieldPositions[fieldKey] = fieldPositions[fieldKey] ?? []; - fieldPositions[fieldKey].push(...metadata[fieldKey].position); + const validFieldMetadataPositions = metadata[ + fieldKey + ]?.position?.filter(position => Array.isArray(position)); + if (validFieldMetadataPositions.length) { + fieldPositions[fieldKey] = fieldPositions[fieldKey] ?? []; + fieldPositions[fieldKey].push(...validFieldMetadataPositions); + } }); return fieldPositions;