Heim >PHP-Framework >Denken Sie an PHP >Wie führe ich eine Elasticsearch-Volltextsuche in ThinkPHP6 durch?

Wie führe ich eine Elasticsearch-Volltextsuche in ThinkPHP6 durch?

PHPz
PHPzOriginal
2023-06-12 10:38:561778Durchsuche

Mit der rasanten Entwicklung des Internets und der Zunahme des Datenvolumens ist die effiziente Durchführung einer Volltextsuche für immer mehr Entwickler zu einem Problem geworden. Elasticsearch ist eine beliebte Volltextsuchmaschine, die große Mengen an Textdaten schnell verarbeiten, abrufen und analysieren kann und damit das Werkzeug der Wahl für viele Webanwendungen ist. Jetzt unterstützt ThinkPHP6 auch Volltextsuchvorgänge von Elasticsearch und bietet Entwicklern so eine effizientere Suchlösung.

Zuerst müssen wir die Elasticsearch-Unterstützungsbibliothek in ThinkPHP6 installieren. Dies kann durch Hinzufügen des folgenden Codes in der Datei „composer.json“ erfolgen:

"require": {

"elasticsearch/elasticsearch": "^7.0"

}

Führen Sie dann Composer im Projekt aus Führen Sie den Befehl zum Aktualisieren des Stammverzeichnisses aus, um die Installation der Elasticsearch-Unterstützungsbibliothek abzuschließen.

Als nächstes erstellen wir einen Elasticsearch-Dienstanbieter, der die Elasticsearch-Client-Instanz in den Container bindet, sodass wir sie per Abhängigkeitsinjektion immer in unserer Anwendung verwenden können. Erstellen Sie im App/Provider-Verzeichnis die Datei ElasticsearchServiceProvider.php mit dem folgenden Code:

namespace appprovider;

use ElasticsearchClientBuilder;
use thinkService;

class ElasticsearchServiceProvider erweitert 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);
}

}

In diesem Fall Zuerst erhalten wir die Hostadresse von Elasticsearch aus der Konfigurationsdatei config/elasticsearch.php, erstellen dann mithilfe der ClientBuilder-Klasse eine Elasticsearch-Client-Instanz und binden sie an den Container der Anwendung, sodass wir damit jederzeit Volltextsuchen durchführen können zeitbetrieben.

Als nächstes zeigen wir, wie Volltextsuchvorgänge in ThinkPHP6-Anwendungen durchgeführt werden. Hier erstellen wir eine ElasticsearchService-Dienstklasse, die mehrere einfache Methoden zum Durchführen von Suchvorgängen enthält. Der Code lautet wie folgt:

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

}

In dieser Serviceklasse definieren wir vier Methoden: createIndex, deleteIndex, indexDocument und searchDocuments. Diese Methoden kapseln Aufrufe an die Elasticsearch-API und erleichtern so das Erstellen und Löschen von Indizes sowie das Hinzufügen und Durchsuchen von Dokumenten.

Jetzt zeigen wir Ihnen, wie Sie diese Methoden anwenden. Hier erstellen wir eine Testseite, erstellen einen Index namens „Artikel“, fügen einige Dokumente hinzu und verwenden dann das Suchfeld, um nach den Dokumenten zu suchen. Erstellen Sie im App/Controller-Verzeichnis eine ElasticsearchTestController.php-Datei mit dem folgenden Code:

namespace appcontroller;

use appServiceElasticsearchService;
use thinkRequest;

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

}

in diesem Controller, Wir haben den ElasticsearchService-Dienst injiziert und die Methoden createIndex, indexDocument und searchDocuments in der Indexmethode aufgerufen, um den Index zu erstellen, Dokumente hinzuzufügen und Suchvorgänge durchzuführen. Das Suchfeld und die Suchergebnisse werden ebenfalls in die Indexmethode einbezogen.

Zu diesem Zeitpunkt haben wir die Demonstration der Verwendung von Elasticsearch für Volltextsuchvorgänge in ThinkPHP6-Anwendungen abgeschlossen. Es ist erwähnenswert, dass es sich bei diesem Beispiel nur um einen einfachen Demonstrationsanwendungsfall handelt. In tatsächlichen Projekten sind detailliertere Indexdesigns und Dokumentenverwaltung erforderlich, um die Sucheffizienz und die Genauigkeit der Suchergebnisse sicherzustellen.

Im Allgemeinen hat sich Elasticsearch mit der weit verbreiteten Anwendung zu einer sehr beliebten und effizienten Volltextsuchmaschine in Webanwendungen entwickelt. In ThinkPHP6 können wir mithilfe der Elasticsearch-Unterstützungsbibliothek und der Elasticsearch-API problemlos Volltextsuchvorgänge durchführen.

Das obige ist der detaillierte Inhalt vonWie führe ich eine Elasticsearch-Volltextsuche in ThinkPHP6 durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn