LoginSignup
4
2

More than 5 years have passed since last update.

Laravelから使うApache Solr

Last updated at Posted at 2018-12-15

Apache Solr
オープンソース全文検索エンジンサーバ
http://lucene.apache.org/solr/

Solarium PHP Solr client library
https://github.com/solariumphp/solarium

Solrはどこかにセットアップされていることを前提とします。

各バージョンは以下の通りとなります。
PHP 7.2、laravel 5.7、solr 7.6、Solarium 4

セットアップ

PHP用のSolrアクセス用のライブラリである、Solariumをセットアップします。

$ composer require solarium/solarium

設定ファイルを書きます。ローカルに「test」という名前のコアをつくりました。

config/solarium.php
<?php
return [
    'endpoint' => [
        'localhost' => [
            'host' => env('SOLARIUM_HOST', '127.0.0.1'),
            'port' => env('SOLARIUM_PORT', 8983),
            'path' => env('SOLARIUM_PATH', '/solr'),
            'core' => env('SOLARIUM_CORE', 'test'),
        ]
    ]
];

レコードを追加

コアにデータを登録します。書籍データです。

    // Solrクライアント取得
    $client = new Solarium\Client(config('solarium'));
    // 更新オブジェクトを生成
    $update = $client->createUpdate();

    // まとめて登録
    foreach ($books as $book) {
        $doc = $update->createDocument();

        $doc->source = $book->source;
        $doc->sid = $book->isbn;
        $doc->country = $book->getIsbnCountry();
        $doc->title = $book->title;
        $doc->author = $book->author;
        $doc->pubdate = $book->pubdate;

        $update->addDocument($doc);
    }

    // Solrへ更新をコミット
    $update->addCommit();
    $result = $client->update($update);

    if ($result->getStatus() != 0) {
        Log::error('Solr update failed.');
    }

レコードを検索

登録した書籍データを検索します。
固定フィルターや、オフセットと取得数、ソートの設定が可能です。
ただし、ソートをすると検索スコアに関係なくソートされてしまうので注意が必要です。

    // Solrクライアント取得
    $client = new Solarium\Client(config('solarium'));
    // 検索オブジェクトを生成
    $query = $client->createSelect();

    // フィルターを設定
    $query->createFilterQuery('source')->setQuery('source:openbd');
    // 検索クエリ
    $query->setQuery('title:よつばと! AND author:"あずま きよひこ"');
    // オフセットと取得数を設定
    $query->setStart($offset)->setRows($limit);
    // ソートを設定
    $query->addSort('pubdate', $query::SORT_DESC);

    // 検索を実行
    $result = $client->select($query);

    // 検索結果
    // 結果.総件数 : $results->getNumFound();
    foreach ($results as $doc) {
        // 結果.各アイテム : $doc->isbn
    }

簡単ですが以上です。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2