2017-08-31 100 views
0

希望你很好。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); 

TIA

+0

我不知道PHP(或這個庫),但你要找的是什麼[分頁](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search -request-sort.html)。它看起來像ONGR \ ElasticsearchDSL \搜索有一個[addSort函數](https://github.com/ongr-io/ElasticsearchDSL/blob/master/src/Search.php#L362),但我不知道足夠的PHP告訴你如何使用它。 :) – dshockley

回答

1

很好聽,你喜歡ElasticSearchDSL。首先建議,不要將BOOL查詢作爲獨立使用。除非您確實需要,否則此查詢旨在用作搜索對象內的幫助器。

因此,請嘗試這種方法。我添加了如何使用sort作爲示例。

$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); 
+0

非常喜歡這個迴應。一旦我離開我目前的項目x,讓我玩耍 – PHPology

相關問題