Перейти к содержимому


Фотография
- - - - -

Фильтр (поиск) в админке статей

поиск админка

Лучший Ответ CB9TOIIIA , 30 July 2015 - 12:47

Поэкспериментировал, пока склоняюсь к этому варианту:


if ($search) {

    $searchData  = explode(' ', $search);
    $searchWhere = array();

    $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id';

    foreach ($searchData as $searchWord) {

        $searchWord = JString::trim($searchWord);

        $searchWhere[] = implode(' OR ', array(
//          'LOWER(a.name) REGEXP  ' . $this->db->Quote('^' . $this->db->escape($searchWord, true) . '', false),
//			'LOWER(a.name) REGEXP  ' . $this->db->Quote('' . $this->db->escape($searchWord, true) . '$', false),
//			'LOWER(a.name) REGEXP  ' . $this->db->Quote(' ' . $this->db->escape($searchWord, true) . '', false),
//			'LOWER(a.name) REGEXP  ' . $this->db->Quote('' . $this->db->escape($searchWord, true) . ' ', false),
			'LOWER(a.name) REGEXP  ' . $this->db->Quote('[[:<:]]' . $this->db->escape($searchWord, true) . '[[:>:]]', false)

        ));
    }

    $where[] = '((' . implode(') AND (', $searchWhere) . '))';
}

Перейти к сообщению


  • Закрытая тема Тема закрыта
Сообщений в теме: 7

#1 CB9TOIIIA

CB9TOIIIA

Отправлено 28 July 2015 - 07:37

Всем привет! В общем есть задача сделать в админке поиск немного другим. Пример:

 

Надо найти в админке статьи с запросом: рошен (конфеты), если вбить выйдут все статьи, где упоминаются эти буквы...

порошенко.

 

Spoiler

 

Есть ли возможность добавить/изменить логику - чтобы искал и находил:

 

Spoiler
 
Это вроде называется не полнотекстовый, а точный поиск...
 
Joomla: 3.4.3     JBZoo: 2.1.5 Pro     Zoo: 3.3.6  

  • -1

#2 CB9TOIIIA

CB9TOIIIA

Отправлено 28 July 2015 - 07:40

Ушел пробовать: http://forum.jbzoo.c...hl=точный поиск... авось поможет :)


  • 0

#3 CB9TOIIIA

CB9TOIIIA

Отправлено 28 July 2015 - 07:55

что-то не подошел... не ищет как нужно

administrator/components/com_zoo/controllers/item.php в файле правил по рецепту

попробовал:

if ($search) {
    $searchData  = explode(' ', $search);
    $searchWhere = array();

    $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id';

    foreach ($searchData as $searchWord) {

        $searchWord = JString::trim($searchWord);

        $searchWhere[] = implode(' AND ', array(
            'LOWER(a.name) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false),
            'LOWER(s.value) LIKE ' . $this->db->Quote('% ' . $this->db->escape($searchWord, true) . '%', false)
        ));
    }

    $where[] = '((' . implode(') OR (', $searchWhere) . '))';
}

Пробел стоит: 

 'LOWER(s.value) LIKE ' . $this->db->Quote('% ' . $this->db->escape($searchWord, true) . '%', false)

Но не совсем то - плохо ищет.


Сообщение отредактировал CB9TOIIIA: 28 July 2015 - 11:41

  • 0

#4 CB9TOIIIA

CB9TOIIIA

Отправлено 28 July 2015 - 21:28

Точный поиск разве никто не делал? по имени (название)  (sweat)


  • 0

#5 SmetDenis

SmetDenis

Отправлено 29 July 2015 - 13:30

Разрешите вмешаюсь :)
 
Точный поиск - это когда строка полностью совпадает  один в один с учетом всех пробелов, всех символов и даже регистра букв. Шаг в право-влево и слово не будет найдено.  Полнотекстовый, когда нужно найти только часть строки в другой строке.
 
В данном случае нужно найти начало слова.
 
По умолчанию, в база данных сайты ищут через LIKE '%рошен%'.
Тут скорее всего нужно попробовать LIKE 'рошен%'
 
rrat_200x0.png
 
Либо вообще использовать регулярное выражение (гибкий но медленный вариант).
http://stackoverflow...whole-word-only
http://stackoverflow...-match-in-mysql
http://stackoverflow...acters-in-mysql
 
Т.е примерно так 
'LOWER(s.value) REGEXP "' . $this->db->Quote('[[:<:]]' . $this->db->escape($searchWord, true) . '[[:>:]]', false) . '"'
Так же там можно учитывать пунктуацию, пробелы итд (по ссылкам есть примеры).
  • 1
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#6 CB9TOIIIA

CB9TOIIIA

Отправлено 29 July 2015 - 13:36

Спасибо :) как сервер настроим - отпишусь о результатах.

 

Spoiler

  • 0

#7 SmetDenis

SmetDenis

Отправлено 29 July 2015 - 13:46

Растете на глазах :)
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#8 CB9TOIIIA

CB9TOIIIA

Отправлено 30 July 2015 - 12:47   Лучший Ответ

Поэкспериментировал, пока склоняюсь к этому варианту:


if ($search) {

    $searchData  = explode(' ', $search);
    $searchWhere = array();

    $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id';

    foreach ($searchData as $searchWord) {

        $searchWord = JString::trim($searchWord);

        $searchWhere[] = implode(' OR ', array(
//          'LOWER(a.name) REGEXP  ' . $this->db->Quote('^' . $this->db->escape($searchWord, true) . '', false),
//			'LOWER(a.name) REGEXP  ' . $this->db->Quote('' . $this->db->escape($searchWord, true) . '$', false),
//			'LOWER(a.name) REGEXP  ' . $this->db->Quote(' ' . $this->db->escape($searchWord, true) . '', false),
//			'LOWER(a.name) REGEXP  ' . $this->db->Quote('' . $this->db->escape($searchWord, true) . ' ', false),
			'LOWER(a.name) REGEXP  ' . $this->db->Quote('[[:<:]]' . $this->db->escape($searchWord, true) . '[[:>:]]', false)

        ));
    }

    $where[] = '((' . implode(') AND (', $searchWhere) . '))';
}


  • 2





Темы с аналогичным тегами поиск, админка

Click to return to top of page in style!