Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Carian kabur dan pelaksanaan carian semantik berdasarkan Elasticsearch dalam PHP

Carian kabur dan pelaksanaan carian semantik berdasarkan Elasticsearch dalam PHP

WBOY
WBOYasal
2023-10-03 08:37:55609semak imbas

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

Pelaksanaan carian kabur dan carian semantik berdasarkan Elasticsearch dalam PHP memerlukan contoh kod khusus

Dalam persekitaran Internet moden, fungsi carian telah menjadi salah satu fungsi yang diperlukan untuk pelbagai aplikasi. Carian kabur tradisional selalunya hanya boleh melakukan padanan mudah berdasarkan kata kunci, tetapi kurang memahami niat pengguna. Carian semantik boleh menangkap niat pengguna dengan lebih baik dan memberikan hasil carian yang lebih tepat. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Elasticsearch untuk melaksanakan carian kabur dan carian semantik dalam PHP, dan memberikan contoh kod khusus.

Elasticsearch ialah enjin carian sumber terbuka berdasarkan Lucene, yang menyediakan fungsi carian yang kaya dan sokongan carian teragih yang cekap. Dalam PHP, kita boleh menggunakan perpustakaan pelanggan rasmi yang disediakan oleh Elasticsearch - Elasticsearch-PHP untuk berinteraksi dengan Elasticsearch.

Pertama, kita perlu memperkenalkan perpustakaan Elasticsearch-PHP ke dalam projek PHP. Ia boleh dipasang melalui Komposer. Anda hanya perlu menambah kebergantungan berikut pada fail composer.json dalam direktori akar projek:

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

Kemudian laksanakan perintah composer install untuk memasang. 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

Seterusnya, kita perlu mewujudkan sambungan dengan Elasticsearch. Dalam PHP, ini boleh dicapai melalui kod berikut:

rrreee

localhost:9200 dalam kod di atas ialah alamat dan port perkhidmatan Elasticsearch Secara lalai, alamat pendengaran Elasticsearch ialah localhost dan port ialah 9200. Jika Elasticsearch dijalankan pada mesin lain atau port berbeza, ia perlu diubah suai kepada nilai yang sepadan. 🎜🎜Kini, kita boleh mula melaksanakan fungsi carian kabur. Berikut ialah contoh mudah: 🎜rrreee🎜 my_index dalam kod di atas ialah indeks dalam Elasticsearch dan title ialah nama medan. Kami melakukan carian kabur melalui pertanyaan padan dan menggunakan parameter fuzziness untuk menetapkan tahap padanan kabur. AUTO bermaksud membenarkan Elasticsearch menentukan secara automatik tahap padanan kabur. 🎜🎜Sudah tentu, jika anda memerlukan fungsi carian yang lebih kompleks, anda juga boleh menggunakan jenis pertanyaan lain yang disediakan oleh Elasticsearch, seperti multi_match, bool, dsb. Untuk kaedah penggunaan khusus, sila rujuk kepada dokumentasi rasmi Elasticsearch. 🎜🎜Seterusnya, kami akan memperkenalkan cara melaksanakan fungsi carian semantik. Untuk melaksanakan carian semantik, kita perlu menggunakan pemalam yang dipanggil Elasticsearch-Elasticsearch Elasticsearch-Elasticsearch-DSL. Pemalam ini menyediakan DSL (Bahasa Khusus Domain) yang boleh membina pertanyaan kompleks melalui PHP. 🎜🎜Mula-mula, kita perlu mengubah suai fail composer.json dan menambah kebergantungan berikut: 🎜rrreee🎜 Kemudian laksanakan perintah composer install untuk memasangnya. 🎜🎜Seterusnya, kita boleh menggunakan Elasticsearch-Elasticsearch-DSL untuk membina pertanyaan semantik. Berikut ialah contoh mudah: 🎜rrreee🎜tajuk dan kandungan dalam kod di atas ialah nama medan dalam Elasticsearch, yang kami bina melalui MultiMatchQuery Pertanyaan berbilang medan dengan darjah set padanan kabur. 🎜🎜Melalui contoh kod di atas, kita boleh menggunakan Elasticsearch untuk melaksanakan carian kabur dan fungsi carian semantik dalam PHP. Sudah tentu, dalam senario perniagaan sebenar, fungsi carian boleh dioptimumkan lagi dan dikembangkan untuk mencapai hasil carian yang lebih tepat dan cekap. Harap artikel ini membantu anda! 🎜

Atas ialah kandungan terperinci Carian kabur dan pelaksanaan carian semantik berdasarkan Elasticsearch dalam PHP. 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