summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@controlyourself.ca>2009-03-19 11:01:58 -0400
committerEvan Prodromou <evan@controlyourself.ca>2009-03-19 11:01:58 -0400
commitd1b2a9d7087ecc171f941755b4c3a420cd202842 (patch)
tree4e10480273945d9d983c0ab6ec546dfe4764a57e
parent5dc913f58951815fcaa246e675ff7d30ad93f633 (diff)
Somewhat better behaviour with mixed caps in search
Deal somewhat better with mixed caps in people and notice search.
-rw-r--r--actions/groupsearch.php11
-rw-r--r--actions/noticesearch.php2
-rw-r--r--actions/noticesearchrss.php3
-rw-r--r--actions/peoplesearch.php6
-rw-r--r--lib/search_engines.php34
5 files changed, 32 insertions, 24 deletions
diff --git a/actions/groupsearch.php b/actions/groupsearch.php
index 9b0026db9..109a53ce1 100644
--- a/actions/groupsearch.php
+++ b/actions/groupsearch.php
@@ -1,9 +1,4 @@
<?php
-
-
-// define('GROUPS_PER_PAGE', 20);
-
-
/**
* Group search action class.
*
@@ -90,15 +85,15 @@ class GroupSearchResults extends GroupList
{
var $terms = null;
var $pattern = null;
-
+
function __construct($user_group, $terms, $action)
{
parent::__construct($user_group, $terms, $action);
- $this->terms = array_map('preg_quote',
+ $this->terms = array_map('preg_quote',
array_map('htmlspecialchars', $terms));
$this->pattern = '/('.implode('|',$terms).')/i';
}
-
+
function highlight($text)
{
return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
diff --git a/actions/noticesearch.php b/actions/noticesearch.php
index 83e59dd9a..eb4a072de 100644
--- a/actions/noticesearch.php
+++ b/actions/noticesearch.php
@@ -103,7 +103,7 @@ class NoticesearchAction extends SearchAction
function showResults($q, $page)
{
$notice = new Notice();
- $q = strtolower($q);
+
$search_engine = $notice->getSearchEngine('identica_notices');
$search_engine->set_sort_mode('chron');
// Ask for an extra to see if there's more.
diff --git a/actions/noticesearchrss.php b/actions/noticesearchrss.php
index 0f98ed04b..ba5276d06 100644
--- a/actions/noticesearchrss.php
+++ b/actions/noticesearchrss.php
@@ -62,9 +62,6 @@ class NoticesearchrssAction extends Rss10Action
$notice = new Notice();
- # lcase it for comparison
- $q = strtolower($q);
-
$search_engine = $notice->getSearchEngine('identica_notices');
$search_engine->set_sort_mode('chron');
diff --git a/actions/peoplesearch.php b/actions/peoplesearch.php
index 14177fcf0..9e515ade1 100644
--- a/actions/peoplesearch.php
+++ b/actions/peoplesearch.php
@@ -63,13 +63,13 @@ class PeoplesearchAction extends SearchAction
$profile = new Profile();
- # lcase it for comparison
- $q = strtolower($q);
+ // lcase it for comparison
+ // $q = strtolower($q);
$search_engine = $profile->getSearchEngine('identica_people');
$search_engine->set_sort_mode('chron');
- # Ask for an extra to see if there's more.
+ // Ask for an extra to see if there's more.
$search_engine->limit((($page-1)*PROFILES_PER_PAGE), PROFILES_PER_PAGE + 1);
if (false === $search_engine->query($q)) {
$cnt = 0;
diff --git a/lib/search_engines.php b/lib/search_engines.php
index 559107910..7b9dbb618 100644
--- a/lib/search_engines.php
+++ b/lib/search_engines.php
@@ -74,7 +74,7 @@ class SphinxSearch extends SearchEngine
{
//FIXME without LARGEST_POSSIBLE, the most recent results aren't returned
// this probably has a large impact on performance
- $LARGEST_POSSIBLE = 1e6;
+ $LARGEST_POSSIBLE = 1e6;
if ($rss) {
$this->sphinx->setLimits($offset, $count, $count, $LARGEST_POSSIBLE);
@@ -109,12 +109,25 @@ class MySQLSearch extends SearchEngine
{
function query($q)
{
- if ('identica_people' === $this->table)
- return $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
- 'against (\''.addslashes($q).'\')');
- if ('identica_notices' === $this->table)
- return $this->target->whereAdd('MATCH(content) ' .
- 'against (\''.addslashes($q).'\')');
+ if ('identica_people' === $this->table) {
+ $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
+ 'AGAINST (\''.addslashes($q).'\' IN BOOLEAN MODE)');
+ if (strtolower($q) != $q) {
+ $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
+ 'AGAINST (\''.addslashes(strtolower($q)).'\' IN BOOLEAN MODE)', 'OR');
+ }
+ return true;
+ } else if ('identica_notices' === $this->table) {
+ $this->target->whereAdd('MATCH(content) ' .
+ 'AGAINST (\''.addslashes($q).'\' IN BOOLEAN MODE)');
+ if (strtolower($q) != $q) {
+ $this->target->whereAdd('MATCH(content) ' .
+ 'AGAINST (\''.addslashes(strtolower($q)).'\' IN BOOLEAN MODE)', 'OR');
+ }
+ return true;
+ } else {
+ throw new ServerException('Unknown table: ' . $this->table);
+ }
}
}
@@ -122,10 +135,13 @@ class PGSearch extends SearchEngine
{
function query($q)
{
- if ('identica_people' === $this->table)
+ if ('identica_people' === $this->table) {
return $this->target->whereAdd('textsearch @@ plainto_tsquery(\''.addslashes($q).'\')');
- if ('identica_notices' === $this->table)
+ } else if ('identica_notices' === $this->table) {
return $this->target->whereAdd('to_tsvector(\'english\', content) @@ plainto_tsquery(\''.addslashes($q).'\')');
+ } else {
+ throw new ServerException('Unknown table: ' . $this->table);
+ }
}
}