From facbe605322a0797f71da2d6556a894e29404c05 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 16 Jun 2021 15:36:04 +0800 Subject: [PATCH 1/5] fix: results are not accurate for search Signed-off-by: Kevin --- plugins/search-backend-node/src/engines/LunrSearchEngine.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index be51738920..18f2058583 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -90,6 +90,10 @@ export class LunrSearchEngine implements SearchEngine { index(type: string, documents: IndexableDocument[]): void { const lunrBuilder = new lunr.Builder(); + + lunrBuilder.pipeline.add(lunr.trimmer, lunr.stopWordFilter, lunr.stemmer); + lunrBuilder.searchPipeline.add(lunr.stemmer); + // Make this lunr index aware of all relevant fields. Object.keys(documents[0]).forEach(field => { lunrBuilder.field(field); From 14aad6113c3254b3131315d3d64563c15e2e1d4b Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 16 Jun 2021 17:26:21 +0800 Subject: [PATCH 2/5] fix: results are not accurate for search Signed-off-by: Kevin --- .changeset/cyan-drinks-dream.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cyan-drinks-dream.md diff --git a/.changeset/cyan-drinks-dream.md b/.changeset/cyan-drinks-dream.md new file mode 100644 index 0000000000..acf8ec37e2 --- /dev/null +++ b/.changeset/cyan-drinks-dream.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-node': minor +--- + +Searching for things like "World" in "Hello World." returns no results. From eb93bf2720c5d14a70d270320a1ecfc95e89f4aa Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 16 Jun 2021 17:28:42 +0800 Subject: [PATCH 3/5] fix: results are not accurate for search Signed-off-by: Kevin --- .changeset/cyan-drinks-dream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cyan-drinks-dream.md b/.changeset/cyan-drinks-dream.md index acf8ec37e2..966de7226a 100644 --- a/.changeset/cyan-drinks-dream.md +++ b/.changeset/cyan-drinks-dream.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-search-backend-node': minor +'@backstage/plugin-search-backend-node': patch --- Searching for things like "World" in "Hello World." returns no results. From 53a883bd147bd6531171fcda8b7b74c0bb873555 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 16 Jun 2021 19:57:16 +0800 Subject: [PATCH 4/5] fix: results are not accurate for search Signed-off-by: Kevin --- .changeset/cyan-drinks-dream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cyan-drinks-dream.md b/.changeset/cyan-drinks-dream.md index 966de7226a..f07d83bd90 100644 --- a/.changeset/cyan-drinks-dream.md +++ b/.changeset/cyan-drinks-dream.md @@ -2,4 +2,4 @@ '@backstage/plugin-search-backend-node': patch --- -Searching for things like "World" in "Hello World." returns no results. +Improved the quality of free text searches in LunrSearchEngine. From 6f0b0c1a3340fdbe34063c42f660de53b05b55e4 Mon Sep 17 00:00:00 2001 From: Oliver Sand Date: Wed, 16 Jun 2021 14:43:14 +0200 Subject: [PATCH 5/5] Add tests for stemming and trimming Signed-off-by: Oliver Sand --- .../src/engines/LunrSearchEngine.test.ts | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts index 969e579a53..f27d00097f 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts @@ -191,6 +191,72 @@ describe('LunrSearchEngine', () => { }); }); + it('should perform search query with trailing punctuation and return search results on match (trimming)', async () => { + const mockDocuments = [ + { + title: 'testTitle', + text: 'Hello World.', + location: 'test/location', + }, + ]; + + // Mock indexing of 1 document + testLunrSearchEngine.index('test-index', mockDocuments); + + // Perform search query + const mockedSearchResult = await testLunrSearchEngine.query({ + term: 'World', + filters: {}, + pageCursor: '', + }); + + // Should return 1 result as we are mocking the indexing of 1 document with match on the title field + expect(mockedSearchResult).toMatchObject({ + results: [ + { + document: { + title: 'testTitle', + text: 'Hello World.', + location: 'test/location', + }, + }, + ], + }); + }); + + it('should perform search query by similar words and return search results on match (stemming)', async () => { + const mockDocuments = [ + { + title: 'testTitle', + text: 'Searching', + location: 'test/location', + }, + ]; + + // Mock indexing of 1 document + testLunrSearchEngine.index('test-index', mockDocuments); + + // Perform search query + const mockedSearchResult = await testLunrSearchEngine.query({ + term: 'Search', + filters: {}, + pageCursor: '', + }); + + // Should return 1 result as we are mocking the indexing of 1 document with match on the title field + expect(mockedSearchResult).toMatchObject({ + results: [ + { + document: { + title: 'testTitle', + text: 'Searching', + location: 'test/location', + }, + }, + ], + }); + }); + it('should perform search query and return search results on match with filters', async () => { const mockDocuments = [ {