diff --git a/packages/search-common/src/types.ts b/packages/search-common/src/types.ts index c26ecdcb4c..07a4296b85 100644 --- a/packages/search-common/src/types.ts +++ b/packages/search-common/src/types.ts @@ -66,5 +66,5 @@ export interface DocumentCollator { * additional metadata. */ export interface DocumentDecorator { - execute(documents: IndexableDocument[]): Promise; + execute(type: string, documents: IndexableDocument[]): Promise; } diff --git a/plugins/search-backend-node/src/IndexBuilder.test.ts b/plugins/search-backend-node/src/IndexBuilder.test.ts index e1dc511b97..c7a2a7817a 100644 --- a/plugins/search-backend-node/src/IndexBuilder.test.ts +++ b/plugins/search-backend-node/src/IndexBuilder.test.ts @@ -30,7 +30,7 @@ class TestDocumentCollator implements DocumentCollator { } class TestDocumentDecorator implements DocumentDecorator { - async execute(documents: IndexableDocument[]) { + async execute(_type: string, documents: IndexableDocument[]) { return documents; } } diff --git a/plugins/search-backend-node/src/IndexBuilder.ts b/plugins/search-backend-node/src/IndexBuilder.ts index 71d374e704..acaa18fc03 100644 --- a/plugins/search-backend-node/src/IndexBuilder.ts +++ b/plugins/search-backend-node/src/IndexBuilder.ts @@ -113,7 +113,7 @@ export class IndexBuilder { this.logger.debug( `Decorating ${type} documents via ${decorators[i].constructor.name}`, ); - documents = await decorators[i].execute(documents); + documents = await decorators[i].execute(type, documents); } if (!documents || documents.length === 0) { diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index 3829693d4e..8bff26a784 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -28,6 +28,11 @@ type ConcreteLunrQuery = { documentTypes: string[]; }; +type LunrResultEnvelope = { + result: lunr.Index.Result; + type: string; +}; + export class LunrSearchEngine implements SearchEngine { protected lunrIndices: Record = {}; protected docStore: Record; @@ -104,13 +109,22 @@ export class LunrSearchEngine implements SearchEngine { query, ) as ConcreteLunrQuery; - const results: lunr.Index.Result[] = []; + const results: LunrResultEnvelope[] = []; if (documentTypes.length === 1 && documentTypes[0] === '*') { // Iterate over all this.lunrIndex values. - Object.values(this.lunrIndices).forEach(i => { + Object.keys(this.lunrIndices).forEach(type => { try { - results.push(...i.search(lunrQueryString)); + results.push( + ...this.lunrIndices[type] + .search(lunrQueryString) + .map(result => { + return { + result: result, + type: type, + }; + }) + ); } catch (err) { // if a field does not exist on a index, we can see that as a no-match if ( @@ -123,10 +137,19 @@ export class LunrSearchEngine implements SearchEngine { } else { // Iterate over the filtered list of this.lunrIndex keys. Object.keys(this.lunrIndices) - .filter(d => documentTypes.includes(d)) - .forEach(d => { + .filter(type => documentTypes.includes(type)) + .forEach(type => { try { - results.push(...this.lunrIndices[d].search(lunrQueryString)); + results.push( + ...this.lunrIndices[type] + .search(lunrQueryString) + .map(result => { + return { + result: result, + type: type, + }; + }) + ); } catch (err) { // if a field does not exist on a index, we can see that as a no-match if ( @@ -140,16 +163,16 @@ export class LunrSearchEngine implements SearchEngine { // Sort results. results.sort((doc1, doc2) => { - return doc2.score - doc1.score; + return doc2.result.score - doc1.result.score; }); // Translate results into SearchResultSet - const resultSet: SearchResultSet = { + const realResultSet: SearchResultSet = { results: results.map(d => { - return { type: 'techdocs', document: this.docStore[d.ref] }; + return { type: d.type, document: this.docStore[d.result.ref] }; }), }; - return Promise.resolve(resultSet); + return Promise.resolve(realResultSet); } }