我的一个项目使用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;
}
答案 0 :(得分: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);