jeffleyd / esquery
Use syntax similar to eloquent, using the elastic search service.
Requires
- php: >=8.0
- elasticsearch/elasticsearch: 8.2.0
- illuminate/database: 9.12.2
- illuminate/pagination: 9.12.2
- illuminate/support: 9.12.2
Requires (Dev)
- laravel/legacy-factories: ^1.0.4
- mockery/mockery: ^1.4
- phpunit/phpunit: ^9.4
README
This project is to be similar to the eloquent query, like this
facilitating searches in ElasticSearch's Lucene.
composer require jeffleyd/esquery
PUBLISH THE FILE CONFIG
php artisan vendor:publish --tag="esquery-provider"
Access the config folder and change the settings of the esquery.php file.
USAGE EXAMPLES
First create a mapping for your index
For more information about mapping types: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
$build = EsQuery::index('my_index');
$response = $build->createIndex([
'mappings' => [
'properties' => [
'parent_id' => [
'type' => 'long',
],
'created_at' => [
'type' => 'date',
'format' => 'yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'
]
]
]
]);
If you want to add a new index, you can do it like this
Create a migration file and extend the EsScheme class
public function up()
{
EsScheme::create('bosses', function (EsMapping $table) {
$table->integer('id');
$table->string('name');
$table->string('email');
$table->nested('json');
$table->timestamp('created_at');
$table->timestamp('updated_at');
// If you want to use a simple analyzer, you can add the following line.
$table->setDefaultAnalyzer();
// If you want to use a custom analyzer, you can use the following:
$table->mapping['settings'] = [
'analysis' => [
'default_analyze' => [
'type' => 'custom',
'tokenizer' => 'whitespace',
'char_filter' => [
'html_strip'
],
'filter' => [
'lowercase'
]
]
]
];
});
}
public function down()
{
EsScheme::dropIfExists('boss');
}
Now you can create your first document
$build = EsQuery::index('my_index');
$response = $build->create([
'parent_id' => 1,
'created_at' => '2022-02-26 23:44:00',
]);
Find your document
$build = EsQuery::index('my_index');
$response = $build->where('parent_id', 1)->first(); // Example 1
$response = $build->where('parent_id', '=', 1)->first(); // Example 2
$response = $build->where('parent_id', 1)->get(); // Example 3
$response = $build->where('created_at', '>=' '2022-02-26'))->get(); // Example 4
Performing an aggregation
$build = EsQuery::index('my_index');
$response = $build->where('parent_id', 1)->sum('price', 'total_price')->get(); // Use get() for aggregations
Delete your document
$build = EsQuery::index('my_index');
$response = $build->where('parent_id', 1)->delete(); // Example 1 delete with conditions
$response = $build->delete(5); // Example 2 delete by ID
Delete your index
$build = EsQuery::index('my_index');
$response = $build->deleteIndex();
How you can attach relation
$build = EsQuery::index('my_index');
$response = $build->with('category', 'id', 'group_id')->get();
OR
$build = EsQuery::index('my_index');
$response = $build->with('category', 'id', 'group_id', function (QueryBuilder $query) {
return $query->where('is_active', 1);
})->with('boss', 'id', 'boss_id', function (QueryBuilder $query) {
return $query->where('is_active', 1);
})->get();
INDEX
[x] Create
[x] Delete
[x] Update mapping
[x] Exists
[x] Skip
DOCUMENT
[x] Create
[x] Create Many
[x] Update
[x] Delete by ID
[x] Delete by Query
TYPE SEARCH
[x] FIRST (with/without conditions)
[x] GET (with/without conditions)
[x] PAGINATION (with/without conditions)
[x] AGGREGATION MAX / MIN / SUM / AVG / COUNT
[x] LIMIT
[x] GROUP BY
[x] GROUP BY DATE
CONDITIONS
[x] where
[x] whereIn
[x] whereExists
[x] whereNotExists
[x] whereMissing
[x] between
[x] orderBy
ADDITIONAL
[x] with
[x] reset query after get/first/paginate
ELASTIC SEARCH
Site: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
Version: 8.1