首頁  >  文章  >  php框架  >  在 ThinkPHP6中如何進行Elasticsearch全文搜尋操作?

在 ThinkPHP6中如何進行Elasticsearch全文搜尋操作?

PHPz
PHPz原創
2023-06-12 10:38:561731瀏覽

隨著網路的快速發展和資料量的增加,如何有效率地進行全文搜尋已經成為了越來越多開發者面臨的問題。 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 ServiceService
{

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

{
rree

}

在此服務類別中,我們定義了四個方法:createIndex、deleteIndex、indexDocument和searchDocuments。這些方法封裝了Elasticsearch API的調用,可以輕鬆地建立、刪除索引,新增和搜尋文件。

現在我們將示範如何使用這些方法。在這裡,我們將建立一個測試頁面,可以建立一個名為「articles」的索引,並添加一些文檔,然後使用搜尋框搜尋文檔。在App/controller目錄下,建立一個ElasticsearchTestController.php文件,程式碼如下:

namespace appcontroller;

use appServiceElasticsearchService;

use thinkRequest;

class ElasticsearchTestController extends BaseController

{

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());
    }
}

}

在此控制器中,我們注入了ElasticsearchService服務,並在index方法中呼叫了createIndex、indexDocument和searchDocuments方法來建立索引、新增文檔和執行搜尋操作。搜尋框和搜尋結果也被包含在了index方法中。

至此,我們已經完成了在ThinkPHP6應用程式中使用Elasticsearch進行全文搜尋操作的示範。值得注意的是,本例只是一個簡單的演示用例,實際專案中需要更加細緻地進行索引設計和文件管理,以確保搜尋效率和搜尋結果的準確性。

總的來說,隨著Elasticsearch的廣泛應用,它已經成為了Web應用程式中非常流行且高效的全文搜尋引擎。在ThinkPHP6中,透過使用Elasticsearch支援庫和Elasticsearch API,我們可以輕鬆地進行全文搜尋操作。

以上是在 ThinkPHP6中如何進行Elasticsearch全文搜尋操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn