ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP6 で Elasticsearch 全文検索操作を実行するにはどうすればよいですか?

ThinkPHP6 で Elasticsearch 全文検索操作を実行するにはどうすればよいですか?

PHPz
PHPzオリジナル
2023-06-12 10:38:561681ブラウズ

インターネットの急速な発展とデータ量の増加に伴い、全文検索をいかに効率的に実行するかが、ますます多くの開発者にとって課題となっています。 Elasticsearch は、大量のテキスト データを迅速に処理し、取得して分析できる人気の全文検索エンジンであり、多くの Web アプリケーションで選択されるツールとなっています。現在、ThinkPHP6 は Elasticsearch の全文検索操作のサポートも開始しており、開発者により効率的な検索ソリューションを提供します。

まず、ThinkPHP6 に Elasticsearch サポート ライブラリをインストールする必要があります。これは、composer.json ファイルに次のコードを追加することで実行できます:

"require": {

"elasticsearch/elasticsearch": "^7.0"

}

次に、プロジェクトのルート ディレクトリで Composer update コマンドを実行して、Elasticsearch サポート ライブラリのインストールを完了します。

次に、Elasticsearch サービス プロバイダーを作成し、Elasticsearch クライアント インスタンスをコンテナにバインドして、依存関係の注入を通じてアプリケーションでいつでも使用できるようにします。 App/Provider ディレクトリで、次のコードを含む ElasticsearchServiceProvider.php ファイルを作成します:

namespace appprovider;

use ElasticsearchClientBuilder;
use thinkService;

class ElasticsearchServiceProvider extends Service
{

public function register()
{
    // 获取config/elasticsearch.php配置
    $config = $this->app->config->get('elasticsearch');

    // 创建Elasticsearch客户端实例
    $client = ClientBuilder::create()->setHosts($config['hosts'])->build();

    // 将Elasticsearch客户端实例绑定到容器中
    $this->app->bind('elasticsearch', $client);
}

}

この例では、まず config/elasticsearch.php 設定ファイルから Elasticsearch のホスト アドレスを取得し、次に ClientBuilder クラスを使用してElasticsearch クライアント インスタンス を作成し、それをアプリケーションのコンテナにバインドして、いつでも全文検索操作を実行できるようにします。

次に、ThinkPHP6 アプリケーションで全文検索操作を実行する方法を説明します。ここでは、検索操作を実行するためのいくつかの簡単なメソッドを含む ElasticsearchService サービス クラスを作成します。コードは次のとおりです。

namespace appservice;

use ElasticsearchClient;
use ElasticsearchCommonExceptionsMissing404Exception;
use Throwable;

class ElasticsearchService
{

protected $client;

public function __construct(Client $client)
{
    $this->client = $client;
}

/**
 * 创建索引
 *
 * @param string $indexName 索引名称
 * @return bool
 */
public function createIndex(string $indexName)
{
    $params = [
        'index' => $indexName,
        'body' => [
            'mappings' => [
                'properties' => [
                    'title' => [
                        'type' => 'text'
                    ],
                    'content' => [
                        'type' => 'text'
                    ]
                ]
            ]
        ]
    ];

    try {
        $response = $this->client->indices()->create($params);
        return true;
    } catch (Throwable $e) {
        throw new Exception('创建索引失败:' . $e->getMessage());
    }
}

/**
 * 删除索引
 *
 * @param string $indexName 索引名称
 * @return bool
 */
public function deleteIndex(string $indexName)
{
    try {
        $response = $this->client->indices()->delete(['index' => $indexName]);
        return true;
    } catch (Missing404Exception $e) {
        return false;
    } catch (Throwable $e) {
        throw new Exception('删除索引失败:' . $e->getMessage());
    }
}

/**
 * 添加文档
 *
 * @param string $indexName 索引名称
 * @param string $id 文档ID
 * @param array $data 文档数据
 * @return bool
 */
public function indexDocument(string $indexName, string $id, array $data)
{
    $params = [
        'index' => $indexName,
        'id' => $id,
        'body' => $data
    ];

    try {
        $response = $this->client->index($params);
        return true;
    } catch (Throwable $e) {
        throw new Exception('添加文档失败:' . $e->getMessage());
    }
}

/**
 * 搜索文档
 *
 * @param string $indexName 索引名称
 * @param string $query 查询字符串
 * @return array
 */
public function searchDocuments(string $indexName, string $query)
{
    $params = [
        'index' => $indexName,
        'body' => [
            'query' => [
                'match' => [
                    '_all' => $query
                ]
            ]
        ]
    ];

    try {
        $response = $this->client->search($params);
        return $response['hits']['hits'];
    } catch (Throwable $e) {
        throw new Exception('搜索文档失败:' . $e->getMessage());
    }
}

}

このサービス クラスでは、createIndex、deleteIndex、indexDocument、searchDocuments の 4 つのメソッドを定義します。これらのメソッドは Elasticsearch API への呼び出しをカプセル化するため、インデックスの作成と削除、ドキュメントの追加と検索が簡単になります。

ここで、これらのメソッドの使用方法を説明します。ここでは、テスト ページを作成し、「articles」というインデックスを作成し、いくつかのドキュメントを追加して、検索ボックスを使用してドキュメントを検索します。 App/controller ディレクトリで、次のコードを含む ElasticsearchTestController.php ファイルを作成します:

namespace appcontroller;

use appServiceElasticsearchService;
use thinkRequest;

class ElasticsearchTestController extends BaseController
{

protected $elasticsearchService;

public function __construct(ElasticsearchService $elasticsearchService)
{
    $this->elasticsearchService = $elasticsearchService;
}

public function index()
{
    $this->elasticsearchService->createIndex('articles');

    // 添加测试文档
    $this->elasticsearchService->indexDocument('articles', '1', [
        'title' => 'ThinkPHP',
        'content' => 'ThinkPHP是一款优秀的PHP开发框架'
    ]);
    $this->elasticsearchService->indexDocument('articles', '2', [
        'title' => 'Laravel',
        'content' => 'Laravel是一款流行的PHP开发框架'
    ]);
    $this->elasticsearchService->indexDocument('articles', '3', [
        'title' => 'Symfony',
        'content' => 'Symfony是一款PHP开发框架'
    ]);

    // 搜索框
    $search = Request::instance()->get('search', '');

    // 搜索结果
    $results = $this->elasticsearchService->searchDocuments('articles', $search);

    // 返回搜索结果
    return $this->fetch('index', [
        'results' => $results
    ]);
}

}

このコントローラーでは、ElasticsearchService サービスを挿入し、index メソッドで createIndex、indexDocument、searchDocuments メソッドを呼び出してインデックスを作成し、ドキュメントを追加しました。検索操作を実行します。検索ボックスと検索結果もインデックス方法に含まれます。

これまでに、ThinkPHP6 アプリケーションでの全文検索操作に Elasticsearch を使用するデモンストレーションが完了しました。なお、この例は単なるデモユースケースであり、実際のプロジェクトでは、検索効率や検索結果の正確性を確保するために、より詳細なインデックス設計やドキュメント管理が必要となります。

一般に、Elasticsearch のアプリケーションが広く普及したことにより、Elasticsearch は Web アプリケーションで非常に人気のある効率的な全文検索エンジンになりました。 ThinkPHP6 では、Elasticsearch サポート ライブラリと Elasticsearch API を使用することで、全文検索操作を簡単に実行できます。

以上がThinkPHP6 で Elasticsearch 全文検索操作を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。