Возвращать результаты, когда параметры поиска равны нулю. Zend Lucene
У меня есть несколько полей в форме поиска. Каждое поле может быть пустым. Я строю запрос так:
$search_title = trim($_POST["search_title"]);
$search_skill = trim($_POST["search_skill"]);
$search_company = trim($_POST["search_city"]);
$search_country_id = trim($_POST["search_county_id"]);
$hits = $index->find("title:$search_title and skill:$search_skill and city:$search_city and country_id:$country_id");
Пользователь может заполнить только заголовок или навык или город и т. Д., Но если какое-то поле пусто, у меня нет результата. У меня есть результат, только если все поля заполнены и сопоставлены. Я не получу результаты, если заполнено только одно поле, если пусто, игнорируем это поле:
$hits = $index->find("title: and skill: and city: and country_id:$country_id");
1 ответ
Вы можете попробовать что-то вроде этого:
if ($this->getRequest()->isPost()) {
if ($form->isValid($this->getRequest()->getPost)) {
//get filtered and valid values from search form.
//filter the array for set values
$data = array_filter($form->getValues());
//extract key => vaules as $variable = values
extract($data);
$query1 = new Zend_Search_Lucene_Search_Query_MultiTerm();
//test for variable isset and add term to query
if (isset($search_title)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_title, 'title'));
}
if (isset($search_skill)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_skill, 'skill'));
}
if (isset($search_city)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_city, 'city'));
}
if (isset($search_country_id)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_country_id, 'country_id'));
}
//This should give the AND you are looking for...I hope
$query= new Zend_Search_Lucene_Search_Query_Boolean(array($query1), array(TRUE));
//get result set from query
$hits = $index->find($query);
}
}
если вы используете StringTrim
фильтр в ваших формах вам не нужно будет использовать trim()
функция на ваших данных. Массив $_POST опасен для пользовательских данных, ZF предоставляет getValues()
ряд методов для предоставления данных из объекта запроса (POST и GET), к которым применены фильтры и валидаторы, которые вы указали.
Я использовал extract()
функция в этом случае, потому что я использовал getValues()
поэтому данные были отфильтрованы и проверены. Есть, конечно, другие действительные способы назначить key => value
пары к переменным. Используйте свой любимый.