diff --git a/src/MiniSearch.test.js b/src/MiniSearch.test.js index 42a22c15..47998a15 100644 --- a/src/MiniSearch.test.js +++ b/src/MiniSearch.test.js @@ -160,6 +160,19 @@ describe('MiniSearch', () => { expect(console.warn).not.toHaveBeenCalled() }) + it('cleans up all data of the deleted document', () => { + const otherDocument = { id: 4, title: 'Decameron', text: 'Umana cosa รจ aver compassione degli afflitti' } + const originalFieldLength = JSON.parse(JSON.stringify(ms._fieldLength)) + const originalAverageFieldLength = JSON.parse(JSON.stringify(ms._averageFieldLength)) + + ms.add(otherDocument) + ms.remove(otherDocument) + + expect(ms.documentCount).toEqual(3) + expect(ms._fieldLength).toEqual(originalFieldLength) + expect(ms._averageFieldLength).toEqual(originalAverageFieldLength) + }) + it('does not remove terms from other documents', () => { ms.remove(documents[0]) expect(ms.search('cammin').length).toEqual(1) diff --git a/src/MiniSearch.ts b/src/MiniSearch.ts index 7e700380..e96ea4d3 100644 --- a/src/MiniSearch.ts +++ b/src/MiniSearch.ts @@ -545,10 +545,13 @@ export default class MiniSearch { this.removeTerm(this._fieldIds[field], shortDocumentId, processedTerm) } }) + + this.removeFieldLength(shortDocumentId, this._fieldIds[field], this.documentCount, tokens.length) }) delete this._storedFields[shortDocumentId] delete this._documentIds[shortDocumentId] + delete this._fieldLength[shortDocumentId] this._documentCount -= 1 } @@ -1066,6 +1069,14 @@ export default class MiniSearch { this._averageFieldLength[fieldId] = totalLength / (count + 1) } + /** + * @ignore + */ + private removeFieldLength (documentId: string, fieldId: number, count: number, length: number): void { + const totalLength = (this._averageFieldLength[fieldId] * count) - length + this._averageFieldLength[fieldId] = totalLength / (count - 1) + } + /** * @ignore */