From 68e2f03f46e143b1d103766bb5d28f177539982a Mon Sep 17 00:00:00 2001 From: Roman Parpalak Date: Fri, 17 Nov 2023 19:21:52 +0200 Subject: [PATCH] Fixed lost strtolower call for keywords. Adjusting relevance. --- src/S2/Rose/Entity/FulltextResult.php | 7 +++---- src/S2/Rose/Indexer.php | 3 ++- tests/unit/Rose/IntegrationTest.php | 26 +++++++++++++++----------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/S2/Rose/Entity/FulltextResult.php b/src/S2/Rose/Entity/FulltextResult.php index f30076a..0d2e79c 100644 --- a/src/S2/Rose/Entity/FulltextResult.php +++ b/src/S2/Rose/Entity/FulltextResult.php @@ -93,7 +93,7 @@ public function fillResultSet(ResultSet $resultSet): void if (\count($positionBag->getKeywordPositions()) > 0) { $weights = [ - 'keyword' => 15, + 'keyword' => 10, 'abundance_reduction' => $reductionRatio, ]; if ($positionBag->hasExternalRelevanceRatio()) { @@ -104,9 +104,8 @@ public function fillResultSet(ResultSet $resultSet): void if (\count($positionBag->getTitlePositions()) > 0) { $weights = [ - 'title' => 25, - // TODO seems like this was not used before - // 'abundance_reduction' => $reductionRatio, + 'title' => 25, + 'abundance_reduction' => $reductionRatio, ]; if ($positionBag->hasExternalRelevanceRatio()) { $weights['external_ratio'] = $positionBag->getExternalRelevanceRatio(); diff --git a/src/S2/Rose/Indexer.php b/src/S2/Rose/Indexer.php index e5f7cae..eef712e 100644 --- a/src/S2/Rose/Indexer.php +++ b/src/S2/Rose/Indexer.php @@ -158,11 +158,12 @@ protected function doIndex(Indexable $indexable): void ), $extractionErrors->getFormattedLines()); } + // strtolower in titleStrFromHtml is important $this->addToIndex( $externalId, self::titleStrFromHtml($indexable->getTitle()), $extractionResult->getContentWithMetadata(), - $indexable->getKeywords() + self::titleStrFromHtml($indexable->getKeywords()) ); } diff --git a/tests/unit/Rose/IntegrationTest.php b/tests/unit/Rose/IntegrationTest.php index 100dfd4..859b5b8 100644 --- a/tests/unit/Rose/IntegrationTest.php +++ b/tests/unit/Rose/IntegrationTest.php @@ -89,7 +89,7 @@ public function testFeatures( $resultSet2 = $finder->find(new Query('content')); $this->assertEquals([ - '20:id_2' => 3.8930706202455925, + '20:id_2' => 2.5953804134970615, '20:id_1' => 0.12778564557899275, '10:id_1' => 0.08519043038599518, ], $resultSet2->getSortedRelevanceByExternalId()); @@ -104,14 +104,14 @@ public function testFeatures( $this->assertEquals(0.08519043038599518, $items[2]->getRelevance()); $this->assertEquals('I have changed the content.', $items[2]->getSnippet()); - $this->assertEquals(3.8930706202455925, $items[0]->getRelevance()); + $this->assertEquals(2.5953804134970615, $items[0]->getRelevance()); $this->assertEquals(new \DateTime('2016-08-20 00:00:00+00:00'), $items[0]->getDate()); $this->assertEquals('This is the second page to be indexed. Let\'s compose something new.', $items[0]->getSnippet(), 'No snippets due to keyword match, no description provided, first sentences are used.'); $resultSet2 = $finder->find((new Query('content'))->setLimit(2)); $this->assertEquals([ - '20:id_2' => 3.8930706202455925, + '20:id_2' => 2.5953804134970615, '20:id_1' => 0.12778564557899275 ], $resultSet2->getSortedRelevanceByExternalId()); @@ -121,7 +121,7 @@ public function testFeatures( $resultItems = $resultSet2->getItems(); $this->assertCount(3, $resultItems); - $this->assertEquals(3.8930706202455925, $resultItems[0]->getRelevance(), 'Setting relevance ratio or sorting by relevance is not working'); + $this->assertEquals(2.5953804134970615, $resultItems[0]->getRelevance(), 'Setting relevance ratio or sorting by relevance is not working'); $resultSet2 = $finder->find(new Query('title')); $this->assertEquals('id_1', $resultSet2->getItems()[0]->getId()); @@ -168,19 +168,23 @@ public function testFeatures( ); $this->assertEquals('id_3', $resultSet4->getItems()[0]->getId()); $this->assertEquals( - 'Русский текст. Красным заголовком', + 'Русский текст. Красным заголовком. АБВГ', $resultItems4[0]->getHighlightedTitle($stemmer) ); - $this->assertEquals(50.95596903638126, $resultSet4->getItems()[0]->getRelevance()); + $this->assertEquals( 38.858378912122475, $resultSet4->getItems()[0]->getRelevance()); // Query 5 $resultSet5 = $finder->find(new Query('русский')); $this->assertCount(1, $resultSet5->getItems()); - $this->assertEquals(25, $resultSet5->getItems()[0]->getRelevance()); + $this->assertEquals(18.951204937870607, $resultSet5->getItems()[0]->getRelevance()); $resultSet5 = $finder->find(new Query('русскому')); $this->assertCount(1, $resultSet5->getItems()); - $this->assertEquals(25, $resultSet5->getItems()[0]->getRelevance()); + $this->assertEquals(18.951204937870607, $resultSet5->getItems()[0]->getRelevance()); + + $resultSet5 = $finder->find(new Query('абвг')); + $this->assertCount(1, $resultSet5->getItems()); + $this->assertEquals(26.531686913018852, $resultSet5->getItems()[0]->getRelevance()); // Query 6 $resultSet6 = $finder->find(new Query('учитель не должен')); @@ -276,7 +280,7 @@ public function testFeatures( $similarItems = $readStorage->getSimilar(new ExternalId('id_2', 20), true); $this->assertEquals($right = [ - 'snippet' => 'This is the first page to be indexed.', + 'snippet' => 'This is the first page to be indexed.', ], array_intersect_key($similarItems[0], $right)); $similarItems = $readStorage->getSimilar(new ExternalId('id_2', 20), false, 10); @@ -400,8 +404,8 @@ public function indexableProvider() ->setUrl('any string') ->setRelevanceRatio(3.14) , - (new Indexable('id_3', 'Русский текст. Красным заголовком', '

Для проверки работы нужно написать побольше слов. В 1,7 раз больше. Вот еще одно предложение.

Тут есть тонкость - нужно проверить, как происходит экранировка в сущностях вроде + и +. Для этого нужно включить в текст само сочетание букв "plus".

Еще одна особенность - наличие слов с дефисом. Например, красно-черный, эпл-вотчем, и другие интересные комбинации. Встречаются и другие знаки препинания, например, цифры. Я не помню Windows 3.1, но помню Turbo Pascal 7.0. Надо отдельно посмотреть, что ищется по одной цифре 7... Учитель не должен допускать такого...

А еще текст бывает на других языках. Например, в украинском есть слово ціна. Или что-то может называться словом Gallery.

', 20)) - ->setKeywords('ключевые слова') + (new Indexable('id_3', 'Русский текст. Красным заголовком. АБВГ', '

Для проверки работы нужно написать побольше слов. В 1,7 раз больше. Вот еще одно предложение.

Тут есть тонкость - нужно проверить, как происходит экранировка в сущностях вроде + и +. Для этого нужно включить в текст само сочетание букв "plus".

Еще одна особенность - наличие слов с дефисом. Например, красно-черный, эпл-вотчем, и другие интересные комбинации. Встречаются и другие знаки препинания, например, цифры. Я не помню Windows 3.1, но помню Turbo Pascal 7.0. Надо отдельно посмотреть, что ищется по одной цифре 7... Учитель не должен допускать такого...

А еще текст бывает на других языках. Например, в украинском есть слово ціна. Или что-то может называться словом Gallery.

', 20)) + ->setKeywords('ключевые слова, АБВГ') ->setDescription('') ->setDate(new \DateTime('2016-08-22 00:00:00')) ->setUrl('/якобы.урл')