Skip to content
Snippets Groups Projects
Commit ace9bc05 authored by Jared Hancock's avatar Jared Hancock
Browse files

Dramatically improve full text ticket search perf

parent c5cb8332
No related branches found
No related tags found
No related merge requests found
...@@ -257,31 +257,36 @@ class MysqlSearchBackend extends SearchBackend { ...@@ -257,31 +257,36 @@ class MysqlSearchBackend extends SearchBackend {
function find($query, $criteria=array(), $model=false, $sort=array()) { function find($query, $criteria=array(), $model=false, $sort=array()) {
global $thisstaff; global $thisstaff;
$tables = array();
$mode = ' IN BOOLEAN MODE'; $mode = ' IN BOOLEAN MODE';
#if (count(explode(' ', $query)) == 1) #if (count(explode(' ', $query)) == 1)
# $mode = ' WITH QUERY EXPANSION'; # $mode = ' WITH QUERY EXPANSION';
$where = array('MATCH (search.title, search.content) AGAINST (' $search = 'MATCH (search.title, search.content) AGAINST ('
.db_input($query) .db_input($query)
.$mode.') '); .$mode.')';
$fields = array($where[0] . ' AS `relevance`'); $tables = array("(
SELECT object_type, object_id, $search AS `relevance`
FROM `ost__search` `search`
WHERE $search
) `search`");
switch ($model) { switch ($model) {
case false: case false:
case 'Ticket': case 'Ticket':
$tables[] = ORGANIZATION_TABLE . " A4 ON (A4.id = `search`.object_id $P = TABLE_PREFIX;
AND `search`.object_type = 'O')"; $tables[] = "(select ticket_id as ticket_id from {$P}ticket
$tables[] = USER_TABLE . " A3 ON ((A3.id = `search`.object_id ) B1 ON (B1.ticket_id = search.object_id and search.object_type = 'T')";
AND `search`.object_type = 'U') OR A3.org_id = A4.id)"; $tables[] = "(select A2.id as thread_id, A1.ticket_id from {$P}ticket A1
$tables[] = TICKET_THREAD_TABLE . " A2 ON (A2.id = `search`.object_id join {$P}ticket_thread A2 on (A1.ticket_id = A2.ticket_id)
AND `search`.object_type = 'H')"; ) B2 ON (B2.thread_id = search.object_id and search.object_type = 'H')";
$tables[] = TICKET_TABLE . " A1 ON ((A1.ticket_id = `search`.object_id $tables[] = "(select A3.id as user_id, A1.ticket_id from {$P}user A3
AND `search`.object_type='T') join {$P}ticket A1 on (A1.user_id = A3.id)
OR (A4.id = A3.org_id AND A1.user_id = A3.id) ) B3 ON (B3.user_id = search.object_id and search.object_type = 'U')";
OR A3.id = A1.user_id $tables[] = "(select A4.id as org_id, A1.ticket_id from {$P}organization A4
OR A2.ticket_id = A1.ticket_id)"; join {$P}user A3 on (A3.org_id = A4.id) join {$P}ticket A1 on (A1.user_id = A3.id)
$fields[] = 'A1.`ticket_id`'; ) B4 ON (B4.org_id = search.object_id and search.object_type = 'O')";
$key = 'ticket_id'; $key = 'COALESCE(B1.ticket_id, B2.ticket_id, B3.ticket_id, B4.ticket_id)';
$tables[] = "{$P}ticket A1 ON (A1.ticket_id = {$key})";
$cdata_search = false;
if ($criteria) { if ($criteria) {
foreach ($criteria as $name=>$value) { foreach ($criteria as $name=>$value) {
...@@ -328,15 +333,12 @@ class MysqlSearchBackend extends SearchBackend { ...@@ -328,15 +333,12 @@ class MysqlSearchBackend extends SearchBackend {
$sql = 'SELECT DISTINCT ' $sql = 'SELECT DISTINCT '
. $key . $key
. ' FROM ( SELECT ' . ' FROM '
. implode(', ', $fields)
. ' FROM `'.TABLE_PREFIX.'_search` `search` '
. (count($tables) ? ' LEFT JOIN ' : '')
. implode(' LEFT JOIN ', $tables) . implode(' LEFT JOIN ', $tables)
. ' WHERE ' . implode(' AND ', $where) . ' WHERE ' . implode(' AND ', $where)
// TODO: Consider sorting preferences // TODO: Consider sorting preferences
. ' ORDER BY `relevance` DESC' . ' ORDER BY `relevance` DESC'
. ') __ LIMIT 500'; . ' LIMIT 500';
} }
$res = db_query($sql); $res = db_query($sql);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment