'help/p.md', 'title' => 'Что такое проект', 'tour' => 'create-project', 'topics' => 'создать проект, заявка на лиды', 'chunk_index' => 0, 'content' => 'Проект — это заявка на поток клиентов с выбранного источника.', ]); KnowledgeChunk::create([ 'source_path' => 'help/b.md', 'title' => 'Как пополнить баланс', 'tour' => 'top-up-balance', 'topics' => 'пополнить, закинуть деньги, оплата', 'chunk_index' => 0, 'content' => 'Пополнить баланс: раздел Биллинг, кнопка Пополнить.', ]); }); it('находит релевантный чанк и ранжирует его первым', function () { $hits = app(KnowledgeSearch::class)->search('а что такое проект?', 3); expect($hits)->not->toBeEmpty() ->and($hits[0]->title)->toBe('Что такое проект'); }); it('находит по синонимам из topics («закинуть деньги»)', function () { $hits = app(KnowledgeSearch::class)->search('как закинуть деньги', 3); expect($hits)->not->toBeEmpty() ->and($hits[0]->title)->toBe('Как пополнить баланс'); }); it('на вопрос не по теме возвращает пусто', function () { expect(app(KnowledgeSearch::class)->search('какая погода в москве', 3))->toBeEmpty(); }); it('не падает на спецсимволах в вопросе', function () { expect(app(KnowledgeSearch::class)->search('проект & | ! ( )', 3))->toBeArray(); });