ElasticSearchDSL: упорядочить по релевантности или другим полям, если установлено

надеюсь, с тобой все хорошо.

Я новичок в упругом поиске, и использование плагина ElasticSearchDSL удивительно, конечно, когда у вас есть критерии, где вы можете применить определенную логику, например, если что-то установлено, включить его и т. Д. И т. Д.

Кажется, я попал в кирпичную стену с точки зрения того, что я хочу иметь возможность упорядочить по релевантности, как по умолчанию, НО, скажем, дать возможность упорядочить по date_closing, date_posted и т. Д. (Это функция поиска работы).

Если я не пропустил какую-то терминологию на сайте ONGR, кто-нибудь сталкивался с подобным сценарием до ElasticSearchDSL?

У меня ниже текущего кода (если требуется):

$termQueryForTitle = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('title', $keyword);
$termQueryForDescription = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('description', $keyword);
$termQueryForStatus = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('status', 1);
$termQueryForDeleted = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('is_deleted', 0);
$rangeQueryDateClosing = new ONGR\ElasticsearchDSL\Query\TermLevel\RangeQuery('date_closing', ['gte' => date('Y-m-d')]);
$termsQuerySector = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('job_sector_id', [implode('\', \'', array_filter($sector_id))]);
$termsQuerySubject = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('job_subject_id', [implode('\', \'', array_filter($subject_id))]);
$termsQueryArea = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('area_id', [implode('\', \'', array_filter($area_id))]);
$termsQueryTown = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('town_id', [implode('\', \'', array_filter($town_id))]);

$bool = new ONGR\ElasticsearchDSL\Query\Compound\BoolQuery();
//$bool->addParameter('minimum_should_match', 1);
//$bool->addParameter('boost', 1);
if($keyword != '')
{
$bool->add($termQueryForTitle, $bool::SHOULD);
$bool->add($termQueryForDescription, $bool::SHOULD);
}
if(count($sector_id) > 0)
{
$bool->add($termsQuerySector, $bool::MUST);
}
if(count($subject_id) > 0)
{
$bool->add($termsQuerySubject, $bool::MUST);
}
if(count($area_id) > 0)
{
$bool->add($termsQueryArea, $bool::MUST);
}
if(count($town_id) > 0)
{
$bool->add($termsQueryTown, $bool::MUST);
}
$bool->add($rangeQueryDateClosing, $bool::MUST);
$bool->add($termQueryForStatus, $bool::FILTER);
$bool->add($termQueryForDeleted, $bool::FILTER);

$DSL_search = new ONGR\ElasticsearchDSL\Search();
$DSL_search->addQuery($bool);

$query_params = $DSL_search->toArray();

$data = $this->__elastic->Search_document('jobs', $query_params, $limit, $offset);
//pprint_r($data);

ТИА

0

Решение

приятно слышать, что вам нравится ElasticSearchDSL. Первый совет, не используйте BOOL-запрос как самостоятельный. Этот запрос предназначен для работы в качестве помощника внутри объекта поиска, если он вам действительно не нужен.

Так что вместо этого попробуйте этот подход. Я добавил, как использовать сортировку в качестве примера.

    $termQueryForTitle = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('title', $keyword);
$termQueryForDescription = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('description', $keyword);
$termQueryForStatus = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('status', 1);
$termQueryForDeleted = new ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery('is_deleted', 0);
$rangeQueryDateClosing = new ONGR\ElasticsearchDSL\Query\TermLevel\RangeQuery('date_closing', ['gte' => date('Y-m-d')]);
$termsQuerySector = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('job_sector_id', [implode('\', \'', array_filter($sector_id))]);
$termsQuerySubject = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('job_subject_id', [implode('\', \'', array_filter($subject_id))]);
$termsQueryArea = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('area_id', [implode('\', \'', array_filter($area_id))]);
$termsQueryTown = new ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery('town_id', [implode('\', \'', array_filter($town_id))]);$dslSearch = new ONGR\ElasticsearchDSL\Search();
if($keyword != '') {
$dslSearch->addQuery($termQueryForTitle, BoolQuery::SHOULD);
$dslSearch->addQuery($termQueryForDescription, BoolQuery::SHOULD);
}

//.....
//.....

$sortField1 = new FieldSort('field_to_sort', FieldSort::ASC);
$sortField2 = new FieldSort('second_field_to_sort', FieldSort::DESC);
$dslSearch->addSort($sortField1);
$dslSearch->addSort($sortField2);

$query_params = $dslSearch->toArray();

$data = $this->__elastic->Search_document('jobs', $query_params, $limit, $offset);
//pprint_r($data);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]