scalia / sphinxsearch
Requires
- php: >=5.3.0
- gigablah/sphinxphp: 2.0.8
- illuminate/support: ~4.0
This package is not auto-updated.
Last update: 2022-02-01 12:26:31 UTC
README
Sphinx Search 是一个 Laravel 4 的包,用于查询 Sphinxsearch 并与 Eloquent 集成。
安装
将 scalia/sphinxsearch 添加到 composer.json。
"scalia/sphinxsearch": "dev-master"
运行 composer update 以拉取 Sphinx Search 的最新版本。
现在打开 app/config/app.php 并将服务提供者添加到您的 providers 数组。
'providers' => array( 'Scalia\SphinxSearch\SphinxSearchServiceProvider', )
现在添加别名。
'aliases' => array( 'SphinxSearch' => 'Scalia\SphinxSearch\SphinxSearchFacade', )
配置
要使用 Sphinx Search,您需要配置索引和要查询的模型。为此,将配置发布到您的应用程序中。
php artisan config:publish scalia/sphinxsearch
这将创建文件 app/config/packages/scalia/sphinxsearch/config.php。根据需要修改主机和端口,并配置索引,将它们绑定到表和 id 列。
return array ( 'host' => '127.0.0.1', 'port' => 9312, 'indexes' => array ( 'my_index_name' => array ( 'table' => 'my_keywords_table', 'column' => 'id' ), ) );
或者禁用模型查询,只获取结果 id 列表。
return array ( 'host' => '127.0.0.1', 'port' => 9312, 'indexes' => array ( 'my_index_name' => FALSE, ) );
用法
基本查询(原始 Sphinx 结果)
$results = SphinxSearch::search('my query')->query();
基本查询(与 Eloquent 一起使用)
$results = SphinxSearch::search('my query')->get();
查询另一个 Sphinx 索引,带有限制和过滤器。
$results = SphinxSearch::search('my query', 'index_name') ->limit(30) ->filter('attribute', array(1, 2)) ->range('int_attribute', 1, 10) ->get();
指定匹配和排序类型进行查询。
$result = SphinxSearch::search('my query', 'index_name') ->setFieldWeights( array( 'partno' => 10, 'name' => 8, 'details' => 1 ) ) ->setMatchMode(\Sphinx\SphinxClient::SPH_MATCH_EXTENDED) ->setSortMode(\Sphinx\SphinxClient::SPH_SORT_EXTENDED, "@weight DESC") ->get(true); //passing true causes get() to respect returned sort order
使用地理距离搜索进行查询和排序。
$radius = 1000; //in meters $latitude = deg2rad(25.99); $longitude = deg2rad(-80.35); $result = SphinxSearch::search('my_query', 'index_name') ->setSortMode(\Sphinx\SphinxClient::SPH_SORT_EXTENDED, '@geodist ASC') ->setFilterFloatRange('@geodist', 0.0, $radius) ->setGeoAnchor('lat', 'lng', $latitude, $longitude) ->get(true);
与 Eloquent 集成
此包与 Eloquent 集成良好。您可以通过更改 modelname 来更改索引配置,从而在 SphinxSearch::search 的结果中获取 Eloquent 的 Collection(Illuminate\Database\Eloquent\Collection)。
return array ( 'host' => '127.0.0.1', 'port' => 9312, 'indexes' => array ( 'my_index_name' => array ( 'table' => 'my_keywords_table', 'column' => 'id', 'modelname' => 'Keyword' ), ) );
Eloquent 的预加载与预期相同
$results = SphinxSearch::search('monkeys')->with('arms', 'legs', 'otherLimbs')->get();
有关预加载的更多信息:https://laravel.net.cn/docs/eloquent#eager-loading
Laravel 4 中带有缓存的结果分页
Route::get('/search', function () { $page = Input::get('page', 1); $search = Input::get('q', 'search string'); $perPage = 15; //number of results per page // use a cache so you dont have to keep querying sphinx for every page! $results = Cache::remember(Str::slug($search), 10, function () use($search) { return SphinxSearch::search($search) ->setMatchMode(\Sphinx\SphinxClient::SPH_MATCH_EXTENDED2) ->get(); }); if ($results) { $totalItems = $results->count(); $pages = array_chunk($results->all(), $perPage); $paginator = Paginator::make($pages[$page - 1], $totalItems, $perPage); return View::make('searchpage')->with('data', $paginator); } return View::make('notfound'); });
Laravel 4 中不带缓存的结果分页
Route::get('/search', function () { $page = Input::get('page', 1); $search = Input::get('q', 'search string'); $perPage = 15; //number of results per page $items = null; $results = SphinxSearch::search($search) ->setMatchMode(\Sphinx\SphinxClient::SPH_MATCH_EXTENDED2) ->limit($perPage, ($page-1)* $perPage) ->get(); if (!empty($results['total'])) { $items = Item::whereIn('id', array_keys($results['matches']))->get(); $items = Paginator::make($items->all(), $results['total'], $perPage); $items->appends(['search' => $search]); //add search query string } if($error = SphinxSearch::getErrorMessage()) { // } });
在您完成显示行后,在您的视图中
<?php echo $data->links()?>
通过多个 Sphinx 索引进行搜索(主要/增量)
使用主要+增量方案(www.sphinxconsultant.com/sphinx-search-delta-indexing/)是一种常见策略。当使用增量时,通常需要同时对多个索引进行查询。为了使用 SphinxSearch 实现这一点,修改您的配置文件,如下所示包含 "name" 和 "mapping" 键
return array ( 'host' => '127.0.0.1', 'port' => 9312, 'indexes' => array ( 'name' => array ('main', 'delta'), 'mapping' => array ( 'table' => 'properties', 'column' => 'id' ), ) );
您还可以在搜索中传递多个索引(以逗号或空格分隔),如下所示(如果配置中未指定 "mapping" 键,则搜索检索 ids)
SphinxSearch::search('lorem', 'main, delta')->get();
使用 Sphinx 获取搜索结果摘要
在搜索结果中显示带关键词高亮的摘录非常方便。Sphinx原生支持这个功能。 http://sphinxsearch.com/docs/archives/2.0.3/api-func-buildexcerpts.html
$search = SphinxSearch::search($term, 'articles'); $articles = $search->get(); $excerpt = $search->excerpt(current($articles)->content); or $search = SphinxSearch::search($term, 'articles'); dd($search->excerpts(array_pluck($articles, 'content')));