Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk melaksanakan operasi carian teks penuh Elasticsearch dalam ThinkPHP6?

Bagaimana untuk melaksanakan operasi carian teks penuh Elasticsearch dalam ThinkPHP6?

PHPz
PHPzasal
2023-06-12 10:38:561682semak imbas

Dengan perkembangan pesat Internet dan peningkatan jumlah data, cara untuk melaksanakan carian teks penuh dengan cekap telah menjadi masalah yang dihadapi oleh semakin ramai pembangun. Elasticsearch ialah enjin carian teks penuh popular yang boleh memproses sejumlah besar data teks, mendapatkan dan menganalisisnya dengan cepat, menjadikannya alat pilihan untuk banyak aplikasi web. Kini, ThinkPHP6 juga telah mula menyokong operasi carian teks penuh Elasticsearch, membawa pembangun penyelesaian carian yang lebih cekap.

Pertama, kita perlu memasang perpustakaan sokongan Elasticsearch dalam ThinkPHP6, ini boleh dilakukan dengan menambahkan kod berikut dalam fail composer.json:

"require": {

"elasticsearch/elasticsearch": "^7.0"

}

Kemudian laksanakan arahan kemas kini komposer dalam direktori akar projek untuk melengkapkan pemasangan perpustakaan sokongan Elasticsearch.

Seterusnya, kami akan mencipta pembekal perkhidmatan Elasticsearch yang mengikat tika klien Elasticsearch ke dalam bekas supaya kami sentiasa boleh menggunakannya dalam aplikasi kami melalui suntikan pergantungan. Dalam direktori App/Provider, buat fail ElasticsearchServiceProvider.php dengan kod berikut:

pembekal ruang nama;

gunakan ElasticsearchClientBuilder;
gunakan thinkService;

kelas ElasticsearchServiceProvider melanjutkan Perkhidmatan
{

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

}

Dalam contoh ini, kita mula-mula mendapatkan alamat hos Elasticsearch daripada fail konfigurasi config/elasticsearch.php, dan kemudian gunakan kelas ClientBuilder untuk mencipta contoh klien Elasticsearch , dan ikatkannya pada bekas aplikasi supaya kami boleh menggunakannya untuk melaksanakan operasi carian teks penuh pada bila-bila masa.

Seterusnya, kami akan menunjukkan cara melaksanakan operasi carian teks penuh dalam aplikasi ThinkPHP6. Di sini, kami mencipta kelas perkhidmatan ElasticsearchService, yang mengandungi beberapa kaedah mudah untuk melaksanakan operasi carian. Kodnya adalah seperti berikut:

perkhidmatan aplikasi ruang nama;

gunakan ElasticsearchClient;
gunakan ElasticsearchCommonExceptionsMissing404Exception;
gunakan Throwable;

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

}

Dalam kelas perkhidmatan ini, kami mentakrifkan empat kaedah: createIndex, deleteIndex, indexDocument dan searchDocuments. Kaedah ini merangkumi panggilan ke API Elasticsearch, menjadikannya mudah untuk membuat dan memadam indeks, menambah dan mencari dokumen.

Sekarang kami akan menunjukkan cara menggunakan kaedah ini. Di sini kami akan membuat halaman ujian, mencipta indeks yang dipanggil "artikel", menambah beberapa dokumen, dan kemudian menggunakan kotak carian untuk mencari dokumen. Dalam direktori App/controller, buat fail ElasticsearchTestController.php dengan kod berikut:

namespace appcontroller;

use appServiceElasticsearchService;
use thinkRequest;

class ElasticsearchTestController memanjangkan 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
    ]);
}

}

Dalam pengawal ini, kami menyuntik perkhidmatan ElasticsearchService dan memanggil kaedah createIndex, indexDocument dan searchDocuments dalam kaedah indeks untuk mencipta indeks dan menambah dokumen dan melakukan operasi carian. Kotak carian dan hasil carian juga disertakan dalam kaedah indeks.

Pada ketika ini, kami telah menyelesaikan demonstrasi penggunaan Elasticsearch untuk operasi carian teks penuh dalam aplikasi ThinkPHP6. Perlu diingat bahawa contoh ini hanyalah kes penggunaan demonstrasi yang mudah Dalam projek sebenar, reka bentuk indeks dan pengurusan dokumen yang lebih terperinci diperlukan untuk memastikan kecekapan carian dan ketepatan hasil carian.

Secara umumnya, dengan aplikasi Elasticsearch yang meluas, ia telah menjadi enjin carian teks penuh yang sangat popular dan cekap dalam aplikasi web. Dalam ThinkPHP6, dengan menggunakan perpustakaan sokongan Elasticsearch dan API Elasticsearch, kami boleh melaksanakan operasi carian teks penuh dengan mudah.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan operasi carian teks penuh Elasticsearch dalam ThinkPHP6?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn