Плагин поиска CakePHP, проблема с orCondition
У меня была проблема с методом orCondition. Я хотел бы создать простую поисковую систему, используя этот плагин таким образом, что я просто хочу найти фразу (такую же или похожую), если она находится в базе данных в заголовке и описании, и я действительно не знаю, что я делаю неправильно, Единственный эффект, которого я достиг, - я могу найти заголовок, когда набираю его в форме точно в том же порядке, что и в базе данных. Например, если сообщение называется "Один два три" и я набираю "два", оно работает, но если я набираю "три два", результат не будет. Вот код
Модель:
public $actsAs = array('Search.Searchable');
public $filterArgs = array(
'title' => array('type' => 'query', 'method' => 'orConditions'),
'status' => array('type' => 'value'),
'category' => array('type' => 'value'),
'country' => array('type'=>'value'),
'continent' => array('type'=>'value'),
'cycle' => array('type'=>'value'),);
...
public function orConditions($data = array()) {
$title = $data['title'];
$cond = array(
'OR' => array(
$this->alias . '.title LIKE' => '%' . $title . '%',
$this->alias . '.description LIKE' => '%' . $title . '%',
));
return $cond;
}
Посмотреть:
echo $this->Form->create('Ad', array('url' => array_merge(array('action' => 'index'), $this->params['pass'])));
1 ответ
Я думаю, что вы понимаете несколько вещей неправильно. Поисковый плагин не считается поисковой системой в любом виде. Я думаю, что readme.md также утверждает, что плагин просто реализует шаблон PRG. Это в основном превращает ваш POST в GET, а параметры GET в CakePHP находят условия. Условия поиска являются "поисковой" частью этого.
То, что вы делаете, на самом деле не "поисковая система", поисковая система немного более "умна" и сложна, чем то, что вы пытаетесь сделать. Что вы делаете, это простой запрос SQL с несколькими логическими операторами. То, что вы пытаетесь построить, это поисковый индекс.
Проблема, с которой вы столкнулись, заключается в том, как вы строите запрос, а не в поисковом плагине или CakePHP. Если ваш заголовок "Раз, два, три", и ваше поисковое выражение %two%
это будет работать, потому что оно будет соответствовать названию независимо от того, где находится слово два. Но если вы делаете запрос, используя %three two%
это ничего не будет соответствовать, потому что он ищет именно эту строку.
если вы хотите, чтобы это произошло, вы должны разделить два слова на запрос, как WHERE TITLE LIKE = %two% OR %three%
, Или, если вы хотите сопоставить названия, которые должны содержать оба %two% AND %three%
,
Я рекомендую вам прочитать о полнотекстовом поиске Mysql или о том, как искать данные с использованием SQL в целом. Для построения поискового индекса существуют лучшие базы данных, такие как Elastic Search. Elastic Search предназначен для построения поисковых индексов. То, как вы пытаетесь искать вещи, в какой-то момент наверняка станет неэффективным, в зависимости от того, что для вас означает "простой" или "маленький".