improve scoring by boosting titles, now also major
This commit is contained in:
parent
050482dd4a
commit
77c406c07f
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue