簡體   English   中英

ElasticSearchDSL:按相關性或其他字段排序(如果已設置)

[英]ElasticSearchDSL: Order by relevence or other fields if set

希望你很好。

我是彈性搜索的新手,當您有可以應用某些邏輯(例如設置了某些內容,包括某些內容等)的條件時,使用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);

TIA

很高興聽到您喜歡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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM