Heim  >  Artikel  >  Backend-Entwicklung  >  Fuzzy-Suche und semantische Suchimplementierung basierend auf Elasticsearch in PHP

Fuzzy-Suche und semantische Suchimplementierung basierend auf Elasticsearch in PHP

WBOY
WBOYOriginal
2023-10-03 08:37:55609Durchsuche

PHP 中基于 Elasticsearch 的模糊搜索与语义搜索实现

Die Implementierung der Fuzzy-Suche und der semantischen Suche auf Basis von Elasticsearch in PHP erfordert spezifische Codebeispiele

In der modernen Internetumgebung ist die Suchfunktion zu einer der notwendigen Funktionen für verschiedene Anwendungen geworden. Die herkömmliche Fuzzy-Suche kann oft nur einen einfachen Abgleich auf der Grundlage von Schlüsselwörtern durchführen, es mangelt ihr jedoch an einem Verständnis der Benutzerabsichten. Die semantische Suche kann die Absicht des Benutzers besser erfassen und präzisere Suchergebnisse liefern. In diesem Artikel stellen wir vor, wie Sie mit Elasticsearch die Fuzzy-Suche und die semantische Suche in PHP implementieren, und geben spezifische Codebeispiele.

Elasticsearch ist eine auf Lucene basierende Open-Source-Suchmaschine, die umfangreiche Suchfunktionen und effiziente verteilte Suchunterstützung bietet. In PHP können wir die offizielle Client-Bibliothek von Elasticsearch – Elasticsearch-PHP – verwenden, um mit Elasticsearch zu interagieren.

Zuerst müssen wir die Elasticsearch-PHP-Bibliothek in das PHP-Projekt einführen. Es kann über Composer installiert werden. Sie müssen lediglich die folgenden Abhängigkeiten zur Datei „composer.json“ im Projektstammverzeichnis hinzufügen:

{
  "require": {
    "elasticsearch/elasticsearch": "^7.0"
  }
}

Führen Sie dann zur Installation den Befehl composer install aus. composer install 命令进行安装。

接下来,我们需要与 Elasticsearch 建立连接。在 PHP 中,可以通过以下代码来实现:

<?php
require 'vendor/autoload.php';

$client = ElasticsearchClientBuilder::create()
            ->setHosts(['localhost:9200']) // 修改为 Elasticsearch 的地址和端口
            ->build();
?>

以上代码中的 localhost:9200 是 Elasticsearch 服务的地址和端口,默认情况下 Elasticsearch 监听地址为 localhost,端口为 9200。如果 Elasticsearch 运行在其他机器上或者端口不同,需要修改为相应的值。

现在,我们可以开始实现模糊搜索的功能了。以下是一个简单的例子:

<?php
require 'vendor/autoload.php';

$client = ElasticsearchClientBuilder::create()
            ->setHosts(['localhost:9200'])
            ->build();

$params = [
    'index' => 'my_index',
    'body'  => [
        'query' => [
            'match' => [
                'title' => [
                    'query' => '搜索关键字',
                    'fuzziness' => 'AUTO',
                ],
            ],
        ],
    ],
];

$response = $client->search($params);

foreach ($response['hits']['hits'] as $hit) {
    echo $hit['_source']['title'] . "
";
}
?>

以上代码中的 my_index 是 Elasticsearch 中的一个索引,title 是一个字段名。我们通过 match 查询来进行模糊搜索,利用 fuzziness 参数来设置模糊匹配的程度。AUTO 表示让 Elasticsearch 自动判断模糊匹配程度。

当然,如果需要更加复杂的搜索功能,还可以使用 Elasticsearch 提供的其他查询类型,比如 multi_matchbool 等。具体的使用方法可以参考 Elasticsearch 的官方文档。

接下来,我们将介绍如何实现语义搜索的功能。为了实现语义搜索,我们需要借助一个叫做 Elasticsearch 的插件——Elasticsearch Elasticsearch-Elasticsearch-DSL。该插件提供了可以通过 PHP 构建复杂查询的 DSL(Domain Specific Language)。

首先,我们需要修改 composer.json 文件,添加以下依赖:

{
  "require": {
    "elasticsearch/elasticsearch": "^7.0",
    "elastic/elasticsearch-dsl": "^8.0"
  }
}

然后执行 composer install 命令进行安装。

接下来,我们可以使用 Elasticsearch-Elasticsearch-DSL 来构建语义查询。以下是一个简单的例子:

<?php
require 'vendor/autoload.php';

use ElasticsearchClientBuilder;
use ElasticsearchDSLSearch;

$client = ClientBuilder::create()
            ->setHosts(['localhost:9200'])
            ->build();

$search = new Search();
$search->addQuery(
    (new ElasticsearchElasticsearchDSLQueryMultiMatchQuery('搜索关键词', ['title', 'content']))
        ->setFuzziness('AUTO')
);

$params = [
    'index' => 'my_index',
    'body'  => $search->toArray(),
];

$response = $client->search($params);

foreach ($response['hits']['hits'] as $hit) {
    echo $hit['_source']['title'] . "
";
}
?>

以上代码中的 titlecontent 是 Elasticsearch 中的字段名,我们通过 MultiMatchQuery

Als nächstes müssen wir eine Verbindung mit Elasticsearch herstellen. In PHP kann dies durch den folgenden Code erreicht werden:

rrreee

localhost:9200 im obigen Code ist die Adresse und der Port des Elasticsearch-Dienstes. Standardmäßig ist die Elasticsearch-Abhöradresse localhost und die Port ist 9200. Wenn Elasticsearch auf einem anderen Computer ausgeführt wird oder der Port unterschiedlich ist, muss er auf den entsprechenden Wert geändert werden. 🎜🎜Jetzt können wir mit der Implementierung der Fuzzy-Suchfunktion beginnen. Das Folgende ist ein einfaches Beispiel: 🎜rrreee🎜 my_index im obigen Code ist ein Index in Elasticsearch und title ist ein Feldname. Wir führen eine Fuzzy-Suche über die match-Abfrage durch und verwenden den Parameter fuzziness, um den Grad der Fuzzy-Übereinstimmung festzulegen. AUTO bedeutet, dass Elasticsearch den Grad des Fuzzy-Matchings automatisch bestimmen soll. 🎜🎜Wenn Sie komplexere Suchfunktionen benötigen, können Sie natürlich auch andere von Elasticsearch bereitgestellte Abfragetypen verwenden, z. B. multi_match, bool usw. Informationen zu bestimmten Verwendungsmethoden finden Sie in der offiziellen Dokumentation von Elasticsearch. 🎜🎜Als nächstes stellen wir vor, wie die semantische Suchfunktion implementiert wird. Um die semantische Suche zu implementieren, müssen wir ein Plug-In namens Elasticsearch-Elasticsearch Elasticsearch-Elasticsearch-DSL verwenden. Dieses Plug-in stellt eine DSL (Domain Specific Language) bereit, die komplexe Abfragen über PHP erstellen kann. 🎜🎜Zuerst müssen wir die Datei „composer.json“ ändern und die folgenden Abhängigkeiten hinzufügen: 🎜rrreee🎜 Dann führen Sie den Befehl composer install aus, um sie zu installieren. 🎜🎜Als nächstes können wir Elasticsearch-Elasticsearch-DSL verwenden, um semantische Abfragen zu erstellen. Das Folgende ist ein einfaches Beispiel: 🎜rrreee🎜title und content im obigen Code sind die Feldnamen in Elasticsearch, die wir über MultiMatchQuery erstellt haben Eine Abfrage mit mehreren Feldern und dem Grad des Fuzzy-Matchings. 🎜🎜Durch die obigen Codebeispiele können wir Elasticsearch verwenden, um Fuzzy-Suche und semantische Suchfunktionen in PHP zu implementieren. Natürlich kann die Suchfunktion in tatsächlichen Geschäftsszenarien weiter optimiert und erweitert werden, um genauere und effizientere Suchergebnisse zu erzielen. Ich hoffe, dieser Artikel hilft Ihnen! 🎜

Das obige ist der detaillierte Inhalt vonFuzzy-Suche und semantische Suchimplementierung basierend auf Elasticsearch in PHP. 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