scalia/sphinxsearch

此包已被废弃,不再维护。作者建议使用 sngrl/sphinxsearch 包。

Laravel 查询 Sphinxsearch 的包

0.2 2015-03-28 16:53 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:26:31 UTC


README

Build Status License Latest Stable Version Total Downloads Monthly Downloads Stories in Ready Stars Forks

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')));