2

私のプロジェクトの1つはsolr1.2を使用していますが、検索機能で「スコアで並べ替え」を使用すると機能しません。理由がわかりません。

誰でもこれを説明できますか。私は完全に混乱しています。

私が行う私のコントローラー:

protected function globalSearch($searchTerm, $productFilter = array())
{
    $solrService = $this->get('syd.solr_service');

    $solrQuery = new SolrQuery('*:*');
    $solrQuery->addField('id')
        ->addField('first_product_slug')
        ->addField('first_product_name')
        ->addField('name')
        ->addField('slug')
        ->addField('thumbnail_path')
        ->addField('product_slug')
        ->addField('design_category_id')
        ->addSortField('score', SolrQuery::ORDER_DESC);
    $solrQuery->set("group", "true"); 
    $solrQuery->set("group.field", "first_product_id"); 
    $solrQuery->set("group.limit", 4); 

    if($searchTerm){
        $filterQueries = array();
        $searchTerms = explode(' ',$searchTerm);
        $searchTerms[] = $searchTerm;
        $searchTerm = '("' . implode('" OR "', $searchTerms) . '")';
        $filterQuery = sprintf(self::SEARCH_STRING, $searchTerm);
        $solrQuery->addFilterQuery($filterQuery);
    }

    if (!empty($productFilter))
    {
        $productFiltersArr = array();
        $productFilterQry = '';
        foreach ($productFilter as $productFilterValue )
        {
            $productFiltersArr[] = 'first_product_slug:' . $productFilterValue;
        }
        $productFilterQry = implode(' OR ', $productFiltersArr);
        $solrQuery->addFilterQuery($productFilterQry);
    }

    $solrQuery->setRows(1000);
    try {
        $solrObject = $solrService->query(
            'SydPrintBundle:DesignTemplate',
            $solrQuery,
            SolrService::WRITER_FORMAT_SOLR_OBJECT
        );
        $templates = $solrObject->offsetGet('grouped')->offsetGet('first_product_id')->offsetGet('groups');
    } 
    catch (\Exception $e) {
        $templates = array();
    }

    if (!$templates) {

        if (!empty($searchTerm)) {
            $this->setFlash('catalog-message', 'No results found for your search.');
        }

        return array();
    }
    if (!$searchTerm) {

        if (!empty($searchTerm)) {
            $this->setFlash('catalog-message', 'No results found for your search.');
        }

        return array();
    }

    return $templates;
} 
4

1 に答える 1

0

あなたが言うとき、when i use "sort by score" in search function it's not working私はあなたが結果がスコアによってソートされていないことを言っていると思います。

これは、メインクエリが*:*であり、フィルタクエリを介して検索語を追加しているためです。これは、スコアには影響しません。https://wiki.apache.org/solr/CommonQueryParameters#fqを参照してください。

This parameter can be used to specify a query that can be used to restrict the super set of documents that can be returned, without influencing score.

したがって、検索語フィルタークエリをメインクエリとして作成すると、スコアでソートされた結果が表示されます。

更新: 代わりに

$solrQuery = new SolrQuery('*:*');

使用する

$solrQuery = new SolrQuery();

の代わりに

$solrQuery->addFilterQuery($filterQuery);

使用する

$solrQuery->setQuery($filterQuery);

于 2013-02-20T15:53:01.927 に答える