PHP code example of erikwang2013 / webman-scout
1. Go to this page and download the library: Download erikwang2013/webman-scout library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
erikwang2013 / webman-scout example snippets
$this->app->singleton(\Erikwang2013\WebmanScout\EngineManager::class, function ($app) {
return new \Erikwang2013\WebmanScout\EngineManager($app);
});
protected $commands = [
\Erikwang2013\WebmanScout\Command\ImportCommand::class,
\Erikwang2013\WebmanScout\Command\FlushCommand::class,
\Erikwang2013\WebmanScout\Command\IndexCommand::class,
\Erikwang2013\WebmanScout\Command\DeleteIndexCommand::class,
\Erikwang2013\WebmanScout\Command\DeleteAllIndexesCommand::class,
\Erikwang2013\WebmanScout\Command\QueueImportCommand::class,
\Erikwang2013\WebmanScout\Command\SyncIndexSettingsCommand::class,
];
'opensearch' => [
'host' => getenv('OPENSEARCH_HTTP_HOST') ?: 'https://127.0.0.1:6205',
'username' => getenv('OPENSEARCH_USERNAME') ?: 'admin',
'password' => getenv('OPENSEARCH_PASSWORD') ?: 'admin',
'prefix' => getenv('OPENSEARCH_INDEX_PREFIX') ?: '',
'ssl_verification' => (bool) (getenv('OPENSEARCH_SSL_VERIFICATION') ?: false),
'indices' => [
'products' => [
'settings' => [ /* ... */ ],
'mappings' => [
'properties' => [
'vector' => ['type' => 'knn_vector', 'dimension' => 1536],
'location' => ['type' => 'geo_point'],
],
],
],
],
],
use Erikwang2013\WebmanScout\Searchable;
use support\Model; // Webman; use your Eloquent base otherwise
class Product extends Model
{
use Searchable;
public function searchableAs(): string
{
return 'products';
}
public function toSearchableArray(): array
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'price' => $this->price,
'created_at' => $this->created_at?->timestamp,
'location' => ['lat' => $this->lat, 'lon' => $this->lng],
'vector' => $this->embedding ?? [],
];
}
public function searchableFields(): array
{
return ['title', 'content'];
}
}
// Search
$products = Product::search('phone')->get();
$products = Product::search('phone', function ($builder) {
$builder->where('status', 1);
})->get();
$paginator = Product::search('phone')->paginate(15);
Product::search('keyword')
->where('status', 1)
->whereIn('category_id', [1, 2, 3])
->orderBy('created_at', 'desc')
->limit(20)
->get();
// Indexing
$product->searchableSync();
$product->searchable();
$product->unsearchable();
Product::makeAllSearchable();
Product::removeAllFromSearch();
Product::withoutSyncingToSearch(function () {
Product::query()->where('id', 1)->update(['title' => 'New title']);
});
Product::search('')
->whereRange('created_at', ['gte' => 1609459200, 'lte' => 1640995200], true)
->whereRange('price', ['gte' => 100, 'lt' => 500])
->get();
Product::search('')
->whereGeoDistance('location', 31.23, 121.47, 10.0)
->get();
Product::search('')
->fulltextSearch('keyword', ['title', 'content'], ['operator' => 'and'])
->get();
Product::search('')
->orderByVectorSimilarity([0.1, -0.2 /* ... */], 'vector')
->get();
$builder = Product::search('keyword')
->aggregate('price_ranges', 'range', 'price', ['ranges' => [
['from' => 0, 'to' => 100],
['from' => 100, 'to' => 500],
]])
->facet('category_id', ['size' => 10]);
$results = $builder->get();
$aggregations = $builder->getAggregations();
$facets = $builder->getFacets();
$engine = app(\Erikwang2013\WebmanScout\EngineManager::class)->engine();
$engine->updateIndexMappings('products', [
'properties' => [
'new_field' => ['type' => 'keyword'],
],
]);
$builder = Product::search('keyword');
$builder->whereRange('created_at', $range)->get();
$builder->clearAdvancedConditions();