add and vs or distinction, but partial isnt working in combination with the others yet

This commit is contained in:
Daniel Klabbers 2022-01-06 12:58:50 +01:00
parent b6ac018a56
commit 9108553f09
2 changed files with 34 additions and 12 deletions

View File

@ -4,8 +4,6 @@ namespace Blomstra\Search\Api\Controllers;
use Blomstra\Search\Elasticsearch\MatchPhraseQuery; use Blomstra\Search\Elasticsearch\MatchPhraseQuery;
use Blomstra\Search\Elasticsearch\MatchQuery; use Blomstra\Search\Elasticsearch\MatchQuery;
use Blomstra\Search\Elasticsearch\SimpleSearchQuery;
use Blomstra\Search\Elasticsearch\WildcardQuery;
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;
@ -59,8 +57,9 @@ class SearchController extends ListDiscussionsController
if (! empty($search)) { if (! empty($search)) {
$filterQuery $filterQuery
->add($this->sentenceMatch($search)) ->add($this->sentenceMatch($search))
->add($this->wordMatch($search)) ->add($this->wordMatch($search, 'and'))
->add($this->partialMatch($search)) ->add($this->wordMatch($search, 'or'))
// ->add($this->partialMatch($search))
; ;
} }
@ -202,59 +201,66 @@ class SearchController extends ListDiscussionsController
protected function sentenceMatch(string $q): Query protected function sentenceMatch(string $q): Query
{ {
$query = (new MatchPhraseQuery('content', $q));
return BoolQuery::create() return BoolQuery::create()
// Discussion titles // Discussion titles
->add( ->add(
BoolQuery::create() BoolQuery::create()
->add(TermQuery::create('type', 'discussions'), 'filter') ->add(TermQuery::create('type', 'discussions'), 'filter')
->add((new MatchPhraseQuery('content', $q))->boost(1)), ->add($query->boost(1)),
'should' 'should'
) )
// Post bodies // Post bodies
->add( ->add(
BoolQuery::create() BoolQuery::create()
->add(TermQuery::create('type', 'posts'), 'filter') ->add(TermQuery::create('type', 'posts'), 'filter')
->add((new MatchPhraseQuery('content', $q))->boost(.9)), ->add($query->boost(.9)),
'should' 'should'
); );
} }
protected function wordMatch(string $q) protected function wordMatch(string $q, string $operator = 'or')
{ {
$query = (new MatchQuery('content', $q))
->operator($operator);
$boost = $operator === 'and' ? 1 : .5;
return BoolQuery::create() return BoolQuery::create()
// Discussion titles // Discussion titles
->add( ->add(
BoolQuery::create() BoolQuery::create()
->add(TermQuery::create('type', 'discussions'), 'filter') ->add(TermQuery::create('type', 'discussions'), 'filter')
->add((new MatchQuery('content', $q))->boost(.6)), ->add($query->boost($boost * .6)),
'should' 'should'
) )
// Post bodies // Post bodies
->add( ->add(
BoolQuery::create() BoolQuery::create()
->add(TermQuery::create('type', 'posts'), 'filter') ->add(TermQuery::create('type', 'posts'), 'filter')
->add((new MatchQuery('content', $q))->boost(.5)), ->add($query->boost($boost * .5)),
'should' 'should'
); );
} }
protected function partialMatch(string $q) protected function partialMatch(string $q)
{ {
$wildcard = (new MatchQuery('content_partial', $q)); $query = (new MatchQuery('content_partial', $q));
return BoolQuery::create() return BoolQuery::create()
// Discussion titles // Discussion titles
->add( ->add(
BoolQuery::create() BoolQuery::create()
->add(TermQuery::create('type', 'discussions'), 'filter') ->add(TermQuery::create('type', 'discussions'), 'filter')
->add($wildcard->boost(.3)), ->add($query->boost(.3)),
'should' 'should'
) )
// Post bodies // Post bodies
->add( ->add(
BoolQuery::create() BoolQuery::create()
->add(TermQuery::create('type', 'posts'), 'filter') ->add(TermQuery::create('type', 'posts'), 'filter')
->add($wildcard->boost(.2)), ->add($query->boost(.2)),
'should' 'should'
); );
} }

View File

@ -7,6 +7,7 @@ class MatchQuery extends \Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery
protected string $operator = 'or'; protected string $operator = 'or';
protected float $boost = 1; protected float $boost = 1;
protected ?string $analyzer = null; protected ?string $analyzer = null;
protected bool $zeroTerms = false;
public function and() public function and()
{ {
@ -15,6 +16,13 @@ class MatchQuery extends \Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery
return $this; return $this;
} }
public function operator(string $operator)
{
$this->operator = $operator;
return $this;
}
public function boost(float $boost = 1) public function boost(float $boost = 1)
{ {
$this->boost = $boost; $this->boost = $boost;
@ -29,12 +37,20 @@ class MatchQuery extends \Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery
return $this; return $this;
} }
public function zeroTerms(bool $zeroTerms = true)
{
$this->zeroTerms = $zeroTerms;
return $this;
}
public function toArray(): array public function toArray(): array
{ {
$query = parent::toArray(); $query = parent::toArray();
$query['match'][$this->field]['operator'] = $this->operator; $query['match'][$this->field]['operator'] = $this->operator;
$query['match'][$this->field]['boost'] = $this->boost; $query['match'][$this->field]['boost'] = $this->boost;
$query['match'][$this->field]['zero_terms_query'] = $this->zeroTerms ? 'all' : 'none';
return $query; return $query;
} }