diff options
author | Rob Hoelz <[email protected]> | 2014-04-14 23:18:33 -0500 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2014-04-23 04:49:54 +0000 |
commit | baaf4c3043f428ec009dd48b85e1c2d6cb8abee4 (patch) | |
tree | 7bdf437023fad735a58d149c4177b70b20630b97 /plugins/search_sphinx/init.php | |
parent | 87ddd5e1f9465a24fdb087356e31ab8fe73bdf0a (diff) |
Make search mechanism pluggable
Currently, TinyTinyRSS can use raw SQL or the Sphinx search engine
for searching. It would be nice if other search engines (such as
Xapian) could be used, or if features of the underlying SQL engine
(such as MySQL's FULLTEXT indexes) could be leveraged. This commit
makes searching into a plugin hook, falling back to the builtin behavior
if no search plugin is active. The Sphinx search behavior has been
broken out into a plugin.
Diffstat (limited to 'plugins/search_sphinx/init.php')
-rw-r--r-- | plugins/search_sphinx/init.php | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/plugins/search_sphinx/init.php b/plugins/search_sphinx/init.php new file mode 100644 index 000000000..f2877e44d --- /dev/null +++ b/plugins/search_sphinx/init.php @@ -0,0 +1,60 @@ +<?php + +class Search_Sphinx extends Plugin { + function about() { + return array(1.0, + "Delegate searching for articles to Sphinx", + "hoelzro", + true); + } + + function init($host) { + $host->add_hook($host::HOOK_SEARCH, $this); + + require_once __DIR__ . "/sphinxapi.php"; + } + + function hook_search($search) { + $offset = 0; + $limit = 500; + + $sphinxClient = new SphinxClient(); + + $sphinxpair = explode(":", SPHINX_SERVER, 2); + + $sphinxClient->SetServer($sphinxpair[0], (int)$sphinxpair[1]); + $sphinxClient->SetConnectTimeout(1); + + $sphinxClient->SetFieldWeights(array('title' => 70, 'content' => 30, + 'feed_title' => 20)); + + $sphinxClient->SetMatchMode(SPH_MATCH_EXTENDED2); + $sphinxClient->SetRankingMode(SPH_RANK_PROXIMITY_BM25); + $sphinxClient->SetLimits($offset, $limit, 1000); + $sphinxClient->SetArrayResult(false); + $sphinxClient->SetFilter('owner_uid', array($_SESSION['uid'])); + + $result = $sphinxClient->Query($search, SPHINX_INDEX); + + $ids = array(); + + if (is_array($result['matches'])) { + foreach (array_keys($result['matches']) as $int_id) { + $ref_id = $result['matches'][$int_id]['attrs']['ref_id']; + array_push($ids, $ref_id); + } + } + + $ids = join(",", $ids); + + if ($ids) + return array("ref_id IN ($ids)", array()); + else + return array("ref_id = -1", array()); + } + + function api_version() { + return 2; + } +} +?> |