improve scoring by boosting titles, now also major

This commit is contained in:
Daniel Klabbers 2021-11-10 16:52:53 +01:00
parent 050482dd4a
commit 77c406c07f
3 changed files with 79 additions and 5 deletions

View File

@ -2,6 +2,8 @@
namespace Blomstra\Search\Api\Controllers;
use Blomstra\Search\Elasticsearch\MatchPhraseQuery;
use Blomstra\Search\Elasticsearch\MatchQuery;
use Blomstra\Search\Save\Document as ElasticDocument;
use Blomstra\Search\Elasticsearch\TermsQuery;
use Elasticsearch\Client;
@ -19,7 +21,7 @@ use Illuminate\Support\Str;
use Psr\Http\Message\ServerRequestInterface;
use Spatie\ElasticsearchQueryBuilder\Builder;
use Spatie\ElasticsearchQueryBuilder\Queries\BoolQuery;
use Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery;
use Spatie\ElasticsearchQueryBuilder\Queries\Query;
use Spatie\ElasticsearchQueryBuilder\Queries\TermQuery;
use Spatie\ElasticsearchQueryBuilder\Sorts\Sort;
use Tobscure\JsonApi\Document;
@ -38,6 +40,7 @@ class SearchController extends ListDiscussionsController
protected function data(ServerRequestInterface $request, Document $document)
{
// Not used for now.
$type = Arr::get($request->getQueryParams(), 'type');
$actor = RequestUtil::getActor($request);
@ -47,10 +50,10 @@ class SearchController extends ListDiscussionsController
$include = array_merge($this->extractInclude($request), ['state']);
$filterQuery = (BoolQuery::create())
->add(
BoolQuery::create()
->add(MatchQuery::create('content', $filters['q']))
);
->add($this->sentenceMatch($filters))
->add($this->wordMatch($filters))
;
$builder = (new Builder($this->elastic))
->index(resolve('blomstra.search.elastic_index'))
->size($this->extractLimit($request))
@ -181,4 +184,14 @@ class SearchController extends ListDiscussionsController
return $query;
}
protected function sentenceMatch(array $filters): Query
{
return new MatchPhraseQuery('content', $filters['q']);
}
protected function wordMatch(array $filters)
{
return (new MatchQuery('content', $filters['q']))->boost(.3);
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace Blomstra\Search\Elasticsearch;
use Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery;
class MatchPhraseQuery extends MatchQuery
{
protected float $boost = 1;
public function boost(float $boost = 1)
{
$this->boost = $boost;
return $this;
}
public function toArray(): array
{
$query = parent::toArray()['match'];
$query[$this->field]['boost'] = $this->boost;
return [
'match_phrase' => $query
];
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace Blomstra\Search\Elasticsearch;
class MatchQuery extends \Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery
{
protected string $operator = 'or';
protected float $boost = 1;
public function and()
{
$this->operator = 'and';
return $this;
}
public function boost(float $boost = 1)
{
$this->boost = $boost;
return $this;
}
public function toArray(): array
{
$query = parent::toArray();
$query['match'][$this->field]['operator'] = $this->operator;
$query['match'][$this->field]['boost'] = $this->boost;
return $query;
}
}