Поле поиска в Symfony2 с Solr
Я хочу создать поле поиска на первой странице моего веб-сайта, но я не знаю, как создать его с помощью Solr. Весь мой сайт разработан в Symfony2. Я не использую базу данных для поиска.
Как я могу это сделать?
В моем проекте Solr bundle используйте это:
use SolrClient;
use SolrQuery;
use SolrObject;
use SolrDocument;
use SolrInputDocument;
В базовом файле twig:
<form action="{{ path("home_search") }}" method="get">
<input type="search" name="search"><br>
<input type="submit" value="search">
</form>
Пример моего контроллера:
public function searchAction($templateName = '')
{
$solrService = $this->get('rocket.solr_service');
$solrQuery = new SolrQuery('*:*');
$solrQuery->addField('id')
->addField('name');
if (!empty($templateName)) {
$solrQuery->addFilterQuery(sprintf('name:"%s" OR design_template_tag_name:"%1$s" OR design_category_name:"%1$s"',
$templateName));
}
$solrQuery->setRows(1000);
$solrObject = $solrService->query(
'RocketBraPrintBundle:DesignTemplate',
$solrQuery,
SolrService::WRITER_FORMAT_SOLR_OBJECT
);
$templates = $solrObject->offsetGet('response')->offsetGet('docs');
if (!$templates) {
if (!empty($templateName)) {
$this->setFlash('catalog-message', 'No results found for your search.');
return $this->searchDesignTemplates($categoryTreeSlug,
$productFamilyFaceId);
}
return array();
}
return $templates;
}
Но в файле twig, где это рендер, я не знаю, что буду писать.
Ответы
Ответ 1
вы можете использовать https://github.com/nelmio/NelmioSolariumBundle с использованием реализации солярия
Действительно отлично подходит для лучшего запроса solr
Я уже использую его
здесь образец
$query = 'foo';
$page = 1;
if (array_key_exists('page', $params)) {
$page = (int) $params['page'];
}
$rows = 10;
if (array_key_exists('limit', $params)) {
$rows = (int) $params['limit'];
}
$solarium = $this->get('solarium.client');
//select
$select = $solarium->createSelect();
$escapedQuery = $select->getHelper()->escapePhrase($query);
//dismax
$dismax = $select->getDisMax();
// override the default setting of 'dismax' to enable 'edismax'
$dismax->setQueryParser('edismax');
//fields
$dismax->setQueryFields(
array('title^5','description^0.7'));
$select->setQuery($escapedQuery);
//limit
$select->setRows($rows);
$select->setStart(($page - 1) * $rows);
//type spot only
$select->createFilterQuery('typeFilter')
->setQuery(sprintf('type:%s', 'spot'));
$resultset = $solarium->select($select);
используйте foreach или twig "for in" для отображения вашего solr doc
Ответ 2
Попробуйте что-то вроде этого.
Controlloer.php:
public function searchAction($templateName = '')
{
// ------
// ------
$resultset = $solrObject->offsetGet('response');
// Do some error checks
return array('resultset'=>$resultset);
}
веточка:
<ul>
{% for doc in resultset %}
<li> {{ doc.name }} </li>
{% endfor %}
</ul>
Ответ 3
Я все еще не пробовал, но вы можете попробовать использовать этот новый Учебник Jobeet в Symfony2 что объясняет, как создать систему, а также как использовать Solr в ней.
Я надеюсь, что эта помощь.
Ответ 4
Вы получаете GET-параметры через
$searchName = $request- > query- > get ('search_name');
Но для этого вам все равно нужна переменная $request. Вы можете использовать его как параметр и изменить свою подпись метода на это:
публичная функция anagraficaAction (запрос $request)
Таким образом, вы можете вызвать параметр $request в своем методе.
Другой способ - получить запрос текущего контроллера внутри вашего метода.
$request = $this- > get ('request');
С помощью этого вы можете изменить свой setParameter следующим образом:
setParameter ('nome', $searchName)