Skip to content

Commit

Permalink
IBX-6649: Added support for spell checking
Browse files Browse the repository at this point in the history
  • Loading branch information
adamwojs committed Sep 28, 2023
1 parent 2894870 commit f0018c7
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 6 deletions.
12 changes: 8 additions & 4 deletions src/lib/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
use Ibexa\Core\Base\Exceptions\NotFoundException;

/**
* The Content Search handler retrieves sets of of Content objects, based on a
* The Content Search handler retrieves sets of Content objects, based on a
* set of criteria.
*
* The basic idea of this class is to do the following:
Expand All @@ -33,7 +33,7 @@
* sensible queries from all criterion definitions.
*
* 3) The query might be possible to optimize (remove empty statements),
* reduce singular and and or constructs…
* reduce singular and or constructs…
*
* 4) Additionally we might need a post-query filtering step, which filters
* content objects based on criteria, which could not be converted in to
Expand Down Expand Up @@ -153,7 +153,8 @@ public function findContent(Query $query, array $languageFilter = [])
$this->gateway->findContent($query, $languageFilter),
$query->facetBuilders,
$query->aggregations,
$languageFilter
$languageFilter,
$query->spellcheck

Check failure on line 157 in src/lib/Handler.php

View workflow job for this annotation

GitHub Actions / Unit tests (7.4)

Parameter #5 $spellcheck of method Ibexa\Solr\ResultExtractor::extract() expects Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck|null, bool given.

Check failure on line 157 in src/lib/Handler.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.0)

Parameter #5 $spellcheck of method Ibexa\Solr\ResultExtractor::extract() expects Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck|null, bool given.

Check failure on line 157 in src/lib/Handler.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.1)

Parameter #5 $spellcheck of method Ibexa\Solr\ResultExtractor::extract() expects Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck|null, bool given.
);
}

Expand Down Expand Up @@ -224,7 +225,9 @@ public function findLocations(LocationQuery $query, array $languageFilter = [])
return $this->locationResultExtractor->extract(
$this->gateway->findLocations($query, $languageFilter),
$query->facetBuilders,
$query->aggregations
$query->aggregations,
$languageFilter,
$query->spellcheck

Check failure on line 230 in src/lib/Handler.php

View workflow job for this annotation

GitHub Actions / Unit tests (7.4)

Parameter #5 $spellcheck of method Ibexa\Solr\ResultExtractor::extract() expects Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck|null, bool given.

Check failure on line 230 in src/lib/Handler.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.0)

Parameter #5 $spellcheck of method Ibexa\Solr\ResultExtractor::extract() expects Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck|null, bool given.

Check failure on line 230 in src/lib/Handler.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.1)

Parameter #5 $spellcheck of method Ibexa\Solr\ResultExtractor::extract() expects Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck|null, bool given.
);
}

Expand Down Expand Up @@ -478,6 +481,7 @@ public function supports(int $capabilityFlag): bool
case SearchService::CAPABILITY_SCORING:
case SearchService::CAPABILITY_FACETS:
case SearchService::CAPABILITY_CUSTOM_FIELDS:
case SearchService::CAPABILITY_SPELLCHECK:
case SearchService::CAPABILITY_ADVANCED_FULLTEXT:
case SearchService::CAPABILITY_AGGREGATIONS:
return true;
Expand Down
7 changes: 7 additions & 0 deletions src/lib/Query/Common/QueryConverter/NativeQueryConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,13 @@ public function convert(Query $query, array $languageSettings = [])
}
}

if ($query->spellcheck !== null) {
$params['spellcheck'] = 'true';
$params['spellcheck.q'] = $query->spellcheck->getQuery();

Check failure on line 105 in src/lib/Query/Common/QueryConverter/NativeQueryConverter.php

View workflow job for this annotation

GitHub Actions / Unit tests (7.4)

Cannot call method getQuery() on bool.

Check failure on line 105 in src/lib/Query/Common/QueryConverter/NativeQueryConverter.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.0)

Cannot call method getQuery() on bool.

Check failure on line 105 in src/lib/Query/Common/QueryConverter/NativeQueryConverter.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.1)

Cannot call method getQuery() on bool.
$params['spellcheck.count'] = 1;
$params['spellcheck.collate'] = 'true';
}

return $params;
}

Expand Down
28 changes: 26 additions & 2 deletions src/lib/ResultExtractor.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
*/
namespace Ibexa\Solr;

use Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck;
use Ibexa\Contracts\Core\Repository\Values\Content\Search\AggregationResultCollection;
use Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchHit;
use Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult;
use Ibexa\Contracts\Core\Repository\Values\Content\Search\SpellcheckResult;
use Ibexa\Contracts\Solr\ResultExtractor\AggregationResultExtractor;
use Ibexa\Solr\Gateway\EndpointRegistry;
use Ibexa\Solr\Query\FacetFieldVisitor;
Expand Down Expand Up @@ -49,8 +51,13 @@ public function __construct(
*
* @return \Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult
*/
public function extract($data, array $facetBuilders = [], array $aggregations = [], array $languageFilter = [])
{
public function extract(
$data,
array $facetBuilders = [],
array $aggregations = [],
array $languageFilter = [],
?Spellcheck $spellcheck = null

Check failure on line 59 in src/lib/ResultExtractor.php

View workflow job for this annotation

GitHub Actions / Unit tests (7.4)

Parameter $spellcheck of method Ibexa\Solr\ResultExtractor::extract() has invalid type Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck.

Check failure on line 59 in src/lib/ResultExtractor.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.0)

Parameter $spellcheck of method Ibexa\Solr\ResultExtractor::extract() has invalid type Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck.

Check failure on line 59 in src/lib/ResultExtractor.php

View workflow job for this annotation

GitHub Actions / Unit tests (8.1)

Parameter $spellcheck of method Ibexa\Solr\ResultExtractor::extract() has invalid type Ibexa\Contracts\Core\Repository\Values\Content\Query\Spellcheck.
) {
$result = new SearchResult(
[
'time' => $data->responseHeader->QTime / 1000,
Expand All @@ -61,6 +68,7 @@ public function extract($data, array $facetBuilders = [], array $aggregations =

$result->facets = $this->extractFacets($data, $facetBuilders, $languageFilter);
$result->aggregations = $this->extractAggregations($data, $aggregations, $languageFilter);
$result->spellcheck = $this->extractSpellcheck($data, $spellcheck);

foreach ($data->response->docs as $doc) {
$result->searchHits[] = $this->extractSearchHit($doc, $languageFilter);
Expand Down Expand Up @@ -186,6 +194,22 @@ protected function extractSearchHit(stdClass $doc, array $languageFilter): Searc
]
);
}

protected function extractSpellcheck(stdClass $data, ?Spellcheck $spellcheck): ?SpellcheckResult
{
if ($spellcheck === null) {
return null;
}

if (isset($data->spellcheck)) {
$incorrect = !empty($data->spellcheck->collations);
$query = $data->spellcheck->collations[1] ?? $spellcheck->getQuery();

return new SpellcheckResult($query, $incorrect);
}

return new SpellcheckResult($spellcheck->getQuery(), false);
}
}

class_alias(ResultExtractor::class, 'EzSystems\EzPlatformSolrSearchEngine\ResultExtractor');

0 comments on commit f0018c7

Please sign in to comment.