Skip to content

Commit d8dbbb8

Browse files
authored
Merge pull request #126 from apisearch-io/feature/added-weight-score-strategy-option
Added weight score_strategy boosting
2 parents aa794e0 + 4d123b0 commit d8dbbb8

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

Query/Query.php

+15
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,21 @@ public function setScoreStrategies(ScoreStrategies $scoreStrategies)
12431243
return $this;
12441244
}
12451245

1246+
/**
1247+
* Add score strategy.
1248+
*
1249+
* @param ScoreStrategy $scoreStrategy
1250+
*
1251+
* @return Query
1252+
*/
1253+
public function addScoreStrategy(ScoreStrategy $scoreStrategy)
1254+
{
1255+
$this->scoreStrategies = $this->scoreStrategies ?: ScoreStrategies::createEmpty();
1256+
$this->scoreStrategies->addScoreStrategy($scoreStrategy);
1257+
1258+
return $this;
1259+
}
1260+
12461261
/**
12471262
* Get Fuzziness.
12481263
*

Query/ScoreStrategy.php

+30
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ class ScoreStrategy implements HttpTransportable
5151
*/
5252
const CUSTOM_FUNCTION = 'custom_function';
5353

54+
/**
55+
* @var string
56+
*
57+
* Boosting by relevance field
58+
*/
59+
const WEIGHT = 'weight';
60+
5461
/**
5562
* @var string
5663
*
@@ -320,6 +327,29 @@ public static function createCustomFunction(
320327
return $scoreStrategy;
321328
}
322329

330+
/**
331+
* Create custom function scoring.
332+
*
333+
* @param float $weight
334+
* @param Filter $filter
335+
* @param bool $matchMainQuery
336+
*
337+
* @return ScoreStrategy
338+
*/
339+
public static function createWeightFunction(
340+
float $weight = self::DEFAULT_WEIGHT,
341+
Filter $filter = null,
342+
bool $matchMainQuery = true
343+
): ScoreStrategy {
344+
$scoreStrategy = self::createDefault();
345+
$scoreStrategy->type = 'weight';
346+
$scoreStrategy->weight = $weight;
347+
$scoreStrategy->filter = self::fixFilterFieldPath($filter);
348+
$scoreStrategy->configuration['match_main_query'] = $matchMainQuery;
349+
350+
return $scoreStrategy;
351+
}
352+
323353
/**
324354
* Create custom function scoring.
325355
*

Tests/Query/QueryTest.php

+13
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Apisearch\Model\IndexUUID;
1919
use Apisearch\Query\Query;
2020
use Apisearch\Query\ScoreStrategies;
21+
use Apisearch\Query\ScoreStrategy;
2122
use Apisearch\Query\SortBy;
2223
use Apisearch\Tests\HttpHelper;
2324
use PHPUnit\Framework\TestCase;
@@ -231,4 +232,16 @@ public function testSearchableFields()
231232
$query = HttpHelper::emulateHttpTransport($query);
232233
$this->assertEquals(['field1'], $query->getsearchableFields());
233234
}
235+
236+
/**
237+
* Test add score strategy when empty.
238+
*/
239+
public function testAddScoreStrategyWhenEmpty()
240+
{
241+
$query = Query::createMatchAll();
242+
$this->assertNull($query->getScoreStrategies());
243+
$query->addScoreStrategy(ScoreStrategy::createDefault());
244+
$this->assertInstanceof(ScoreStrategies::class, $query->getScoreStrategies());
245+
$this->assertCount(1, $query->getScoreStrategies()->getScoreStrategies());
246+
}
234247
}

Tests/Query/ScoreStrategiesTest.php

+25
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
namespace Apisearch\Tests\Query;
1717

18+
use Apisearch\Query\Filter;
1819
use Apisearch\Query\ScoreStrategies;
1920
use Apisearch\Query\ScoreStrategy;
2021
use PHPUnit\Framework\TestCase;
@@ -60,4 +61,28 @@ public function testMultiple()
6061
$scoreStrategies->getScoreStrategies()
6162
);
6263
}
64+
65+
/**
66+
* Test to array and from array.
67+
*/
68+
public function testArrayTransformation()
69+
{
70+
$scoreStrategies = ScoreStrategies::createEmpty(ScoreStrategies::AVG);
71+
$scoreStrategies
72+
->addScoreStrategy(ScoreStrategy::createDefault())
73+
->addScoreStrategy(ScoreStrategy::createDefault())
74+
->addScoreStrategy(ScoreStrategy::createWeightFunction(1.1, Filter::create('a', ['b'], Filter::MUST_ALL, Filter::TYPE_FIELD)))
75+
->addScoreStrategy(ScoreStrategy::createFieldBoosting('field1', 1.1, 2.2, 'avg', 4.4, Filter::create('a2', ['b2'], Filter::MUST_ALL, Filter::TYPE_FIELD), 'none'))
76+
->addScoreStrategy(ScoreStrategy::createDecayFunction('gauss', 'a1', 'a2', 'a3', 'a4', 1.1, 2.2, Filter::create('a3', ['b3'], Filter::MUST_ALL, Filter::TYPE_FIELD), 'kk'));
77+
$scoreStrategiesAsArray = $scoreStrategies->toArray();
78+
$this->assertCount(5, $scoreStrategies->getScoreStrategies());
79+
$covertedScoreStrategies = ScoreStrategies::createFromArray($scoreStrategiesAsArray);
80+
81+
$this->assertEquals(
82+
$scoreStrategiesAsArray,
83+
$covertedScoreStrategies->toArray()
84+
);
85+
86+
$this->assertCount(5, $covertedScoreStrategies->getScoreStrategies());
87+
}
6388
}

0 commit comments

Comments
 (0)