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