1
- <img align =" left " width =" 70 " height =" 70 " src =" https://cdn.snipform.io/pdphilip/elasticsearch/laravel-x-es.png " >
2
-
3
- # Laravel-Elasticsearch
1
+ <img
2
+ src="https://cdn.snipform.io/pdphilip/elasticsearch/laravel-es-banner.png "
3
+ alt="Laravel Elasticsearch"
4
+ />
4
5
5
6
[ ![ Latest Stable Version] ( http://img.shields.io/github/release/pdphilip/laravel-elasticsearch.svg )] ( https://packagist.org/packages/pdphilip/elasticsearch )
6
7
[ ![ GitHub Tests Action Status] ( https://img.shields.io/github/actions/workflow/status/pdphilip/laravel-elasticsearch/run-tests.yml?branch=main&label=tests&style=flat-square )] ( https://github.com/pdphilip/laravel-elasticsearch/actions/workflows/run-tests.yml?query=branch%3Amain )
7
8
[ ![ GitHub Code Style Action Status] ( https://img.shields.io/github/actions/workflow/status/pdphilip/laravel-elasticsearch/phpstan.yml?branch=main&label=code%20style&style=flat-square )] ( https://github.com/pdphilip/laravel-elasticsearch/actions/workflows/phpstan.yml?query=branch%3Amain++ )
8
9
[ ![ Total Downloads] ( http://img.shields.io/packagist/dm/pdphilip/elasticsearch.svg )] ( https://packagist.org/packages/pdphilip/elasticsearch )
9
- ### Laravel-Elasticsearch: An Elasticsearch implementation of Laravel's Eloquent ORM
10
+
11
+ ## Laravel-Elasticsearch <br /> An Elasticsearch implementation of Laravel's Eloquent ORM
12
+
13
+ ### The Power of Elasticsearch with Laravel's Eloquent
10
14
11
15
This package extends Laravel's Eloquent model and query builder with seamless integration of Elasticsearch functionalities. Designed to feel native to Laravel, this package enables you to work with Eloquent models while leveraging the
12
16
powerful search and analytics capabilities of Elasticsearch.
13
17
14
- Examples:
18
+ ---
19
+
20
+ The Eloquent you already know:
15
21
16
22
``` php
17
- $logs = UserLog::where('created_at','>=',Carbon::now()->subDays(30))->get();
23
+ UserLog::where('created_at','>=',Carbon::now()->subDays(30))->get();
18
24
```
19
25
20
26
``` php
21
- $updates = UserLog::where('status', 1)->update(['status' => 4]);
27
+ UserLog::create([
28
+ 'user_id' => '2936adb0-b10d-11ed-8e03-0b234bda3e12',
29
+ 'ip' => '62.182.98.146',
30
+ 'location' => [40.7185,-74.0025],
31
+ 'country_code' => 'US',
32
+ 'status' => 1,
33
+ ]);
22
34
```
23
35
24
36
``` php
25
- $updates = UserLog::where('status', 1)->paginate(50 );
37
+ UserLog::where('status', 1)->update(['status' => 4] );
26
38
```
27
39
28
40
``` php
29
- $profiles = UserProfile::whereIn('country_code',['US','CA'] )->orderByDesc('last_login ')->take(10)->get( );
41
+ UserLog::where('status', 4 )->orderByDesc('created_at ')->paginate(50 );
30
42
```
31
43
32
44
``` php
33
- $deleted = UserProfile::where('state','unsubscribed')->where('updated_at','<=',Carbon::now()->subDays(90))->delete();
45
+ UserProfile::whereIn('country_code',['US','CA'])
46
+ ->orderByDesc('last_login')->take(10)->get();
34
47
```
35
48
36
49
``` php
37
- $search = UserProfile::phrase('loves espressos')->highlight()->search();
50
+ UserProfile::where('state','unsubscribed')
51
+ ->where('updated_at','<=',Carbon::now()->subDays(90))->delete();
52
+ ```
53
+
54
+ Elasticsearch with Eloquent:
55
+
56
+ ``` php
57
+ UserProfile::searchTerm('Laravel')->orSearchTerm('Elasticsearch')->get();
58
+ ```
59
+
60
+ ``` php
61
+ UserProfile::searchPhrasePrefix('loves espressos and t')->highlight()->get();
62
+ ```
63
+
64
+ ``` php
65
+ UserProfile::whereMatch('bio', 'PHP')->get();
66
+ ```
67
+
68
+ ``` php
69
+ UserLog::whereGeoDistance('location', '10km', [40.7185,-74.0025])->get();
70
+ ```
71
+
72
+ ``` php
73
+ UserProfile::whereFuzzy('description', 'qick brwn fx')->get();
74
+ ```
75
+
76
+ Built in Relationships (even to SQL models):
77
+
78
+ ``` php
79
+ UserLog::where('status', 1)->orderByDesc('created_at')->with('user')->get();
38
80
```
39
81
40
- ### Read the [ Documentation] ( https://elasticsearch.pdphilip.com/ )
41
- ---
42
- > #### Using [ OpenSearch] ( https://opensearch.pdphilip.com/ ) ? [ Github] ( https://github.com/pdphilip/laravel-opensearch )
43
- ---
44
- > #### [ Package Tests] ( https://github.com/pdphilip/laravel-elasticsearch-tests )
45
82
---
46
83
84
+ # Read the [ Documentation] ( https://elasticsearch.pdphilip.com/ )
85
+
47
86
## Installation
48
87
49
88
### Maintained versions (Elasticsearch 8.x):
50
89
51
- ** Laravel 10.x & 11 .x (main):**
90
+ ** Laravel 10.x, 11.x & 12 .x (main):**
52
91
53
92
``` bash
54
93
composer require pdphilip/elasticsearch
55
94
```
56
95
57
- | Laravel Version | Command | Maintained |
58
- | -----------------| ------------------------------------------------| ------------|
59
- | Laravel 10 & 11 | ` composer require pdphilip/elasticsearch:~4 ` | ✅ |
60
- | Laravel 9 | ` composer require pdphilip/elasticsearch:~3.9 ` | ✅ |
61
- | Laravel 8 | ` composer require pdphilip/elasticsearch:~3.8 ` | ✅ |
96
+ | Laravel Version | Command | Maintained |
97
+ | --------------------| ------------------------------------------------| ------------|
98
+ | Laravel 10/11/12 | ` composer require pdphilip/elasticsearch:~5 ` | ✅ Active |
99
+ | Laravel 10/11 (v4) | ` composer require pdphilip/elasticsearch:~4 ` | 🛠️ LTS |
100
+ | Laravel 9 | ` composer require pdphilip/elasticsearch:~3.9 ` | 🛠️ LTS |
101
+ | Laravel 8 | ` composer require pdphilip/elasticsearch:~3.8 ` | 🛠️ LTS |
62
102
63
103
### Unmaintained versions (Elasticsearch 8.x):
64
104
65
105
| Laravel Version | Command | Maintained |
66
106
| -------------------| ------------------------------------------------| ------------|
67
- | Laravel 7.x | ` composer require pdphilip/elasticsearch:~2.7 ` | ❌ |
68
- | Laravel 6.x (5.8) | ` composer require pdphilip/elasticsearch:~2.6 ` | ❌ |
107
+ | Laravel 7.x | ` composer require pdphilip/elasticsearch:~2.7 ` | ❌ EOL |
108
+ | Laravel 6.x (5.8) | ` composer require pdphilip/elasticsearch:~2.6 ` | ❌ EOL |
69
109
70
110
### Unmaintained versions (Elasticsearch 7.x):
71
111
72
112
| Laravel Version | Command | Maintained |
73
113
| -------------------| ------------------------------------------------| ------------|
74
- | Laravel 9.x | ` composer require pdphilip/elasticsearch:~1.9 ` | ❌ |
75
- | Laravel 8.x | ` composer require pdphilip/elasticsearch:~1.8 ` | ❌ |
76
- | Laravel 7.x | ` composer require pdphilip/elasticsearch:~1.7 ` | ❌ |
77
- | Laravel 6.x (5.8) | ` composer require pdphilip/elasticsearch:~1.6 ` | ❌ |
114
+ | Laravel 9.x | ` composer require pdphilip/elasticsearch:~1.9 ` | ❌ EOL |
115
+ | Laravel 8.x | ` composer require pdphilip/elasticsearch:~1.8 ` | ❌ EOL |
116
+ | Laravel 7.x | ` composer require pdphilip/elasticsearch:~1.7 ` | ❌ EOL |
117
+ | Laravel 6.x (5.8) | ` composer require pdphilip/elasticsearch:~1.6 ` | ❌ EOL |
78
118
79
119
## Configuration
80
120
@@ -89,9 +129,9 @@ ES_CLOUD_ID=
89
129
ES_API_ID =
90
130
ES_API_KEY =
91
131
ES_SSL_CA =
92
- ES_INDEX_PREFIX =my_app
132
+ ES_INDEX_PREFIX =my_app_
93
133
# prefix will be added to all indexes created by the package with an underscore
94
- # ex: my_app_user_logs for UserLog.php model
134
+ # ex: my_app_user_logs for UserLog model
95
135
ES_SSL_CERT =
96
136
ES_SSL_CERT_PASSWORD =
97
137
ES_SSL_KEY =
@@ -102,6 +142,9 @@ ES_OPT_VERIFY_SSL=true
102
142
ES_OPT_RETRIES =
103
143
ES_OPT_META_HEADERS =true
104
144
ES_ERROR_INDEX =
145
+ ES_OPT_BYPASS_MAP_VALIDATION =false
146
+ ES_OPT_DEFAULT_LIMIT =1000
147
+
105
148
```
106
149
107
150
For multiple nodes, pass in as comma-separated:
@@ -122,7 +165,7 @@ ES_CLOUD_ID=XXXXX:ZXVyb3BlLXdl.........SQwYzM1YzU5ODI5MTE0NjQ3YmEyNDZlYWUzOGNkN2
122
165
ES_API_ID =
123
166
ES_API_KEY =
124
167
ES_SSL_CA =
125
- ES_INDEX_PREFIX =my_app
168
+ ES_INDEX_PREFIX =my_app_
126
169
ES_ERROR_INDEX =
127
170
```
128
171
@@ -132,35 +175,37 @@ ES_ERROR_INDEX=
132
175
133
176
``` php
134
177
'elasticsearch' => [
135
- 'driver' => 'elasticsearch',
136
- 'auth_type' => env('ES_AUTH_TYPE', 'http'), //http or cloud
137
- 'hosts' => explode(',', env('ES_HOSTS', 'http://localhost:9200')),
138
- 'username' => env('ES_USERNAME', ''),
139
- 'password' => env('ES_PASSWORD', ''),
140
- 'cloud_id' => env('ES_CLOUD_ID', ''),
141
- 'api_id' => env('ES_API_ID', ''),
142
- 'api_key' => env('ES_API_KEY', ''),
143
- 'ssl_cert' => env('ES_SSL_CA', ''),
144
- 'ssl' => [
145
- 'cert' => env('ES_SSL_CERT', ''),
178
+ 'driver' => 'elasticsearch',
179
+ 'auth_type' => env('ES_AUTH_TYPE', 'http'), //http or cloud
180
+ 'hosts' => explode(',', env('ES_HOSTS', 'http://localhost:9200')),
181
+ 'username' => env('ES_USERNAME', ''),
182
+ 'password' => env('ES_PASSWORD', ''),
183
+ 'cloud_id' => env('ES_CLOUD_ID', ''),
184
+ 'api_id' => env('ES_API_ID', ''),
185
+ 'api_key' => env('ES_API_KEY', ''),
186
+ 'ssl_cert' => env('ES_SSL_CA', ''),
187
+ 'ssl' => [
188
+ 'cert' => env('ES_SSL_CERT', ''),
146
189
'cert_password' => env('ES_SSL_CERT_PASSWORD', ''),
147
- 'key' => env('ES_SSL_KEY', ''),
148
- 'key_password' => env('ES_SSL_KEY_PASSWORD', ''),
190
+ 'key' => env('ES_SSL_KEY', ''),
191
+ 'key_password' => env('ES_SSL_KEY_PASSWORD', ''),
149
192
],
150
193
'index_prefix' => env('ES_INDEX_PREFIX', false),
151
- 'options' => [
152
- 'allow_id_sort' => env('ES_OPT_ID_SORTABLE', false),
194
+ 'options' => [
195
+ 'bypass_map_validation' => env('ES_OPT_BYPASS_MAP_VALIDATION', false),
196
+ 'logging' => env('ES_OPT_LOGGING', false),
153
197
'ssl_verification' => env('ES_OPT_VERIFY_SSL', true),
154
- 'retires' => env('ES_OPT_RETRIES', null),
155
- 'meta_header' => env('ES_OPT_META_HEADERS', true),
198
+ 'retires' => env('ES_OPT_RETRIES', null),
199
+ 'meta_header' => env('ES_OPT_META_HEADERS', true),
200
+ 'default_limit' => env('ES_OPT_DEFAULT_LIMIT', true),
201
+ 'allow_id_sort' => env('ES_OPT_ID_SORTABLE', false),
156
202
],
157
- 'error_log_index' => env('ES_ERROR_INDEX', false), //If set will log ES errors to this index, ex: 'laravel_es_errors'
158
203
],
159
204
```
160
205
161
206
### 3. If packages are not autoloaded, add the service provider:
162
207
163
- For ** Laravel 11** :
208
+ For ** Laravel 11 + ** :
164
209
165
210
``` php
166
211
//bootstrap/providers.php
@@ -191,82 +236,44 @@ Now, you're all set to use Elasticsearch with Laravel as if it were native to th
191
236
192
237
## Getting Started
193
238
194
- - [ Installation] ( https://elasticsearch.pdphilip.com/#installation )
195
- - [ Configuration] ( https://elasticsearch.pdphilip.com/#configuration )
239
+ - [ Installation] ( https://elasticsearch.pdphilip.com/getting-started )
240
+ - [ Configuration] ( https://elasticsearch.pdphilip.com/getting-started #configuration-guide )
196
241
197
- ## Eloquent
242
+ ### Eloquent
198
243
199
- - [ The Base Model] ( https://elasticsearch.pdphilip.com/the-base-model )
200
- - [ Querying Models] ( https://elasticsearch.pdphilip.com/querying-models )
201
- - [ Saving Models] ( https://elasticsearch.pdphilip.com/saving-models )
202
- - [ Deleting Models] ( https://elasticsearch.pdphilip.com/deleting-models )
203
- - [ Ordering and Pagination] ( https://elasticsearch.pdphilip.com/ordering-and-pagination )
204
- - [ Distinct and GroupBy] ( https://elasticsearch.pdphilip.com/distinct )
205
- - [ Aggregations] ( https://elasticsearch.pdphilip.com/aggregation )
206
- - [ Chunking] ( https://elasticsearch.pdphilip.com/chunking )
207
- - [ Nested Queries] ( https://elasticsearch.pdphilip.com/nested-queries )
208
- - [ Elasticsearch Specific Queries] ( https://elasticsearch.pdphilip.com/es-specific )
209
- - [ Full-Text Search] ( https://elasticsearch.pdphilip.com/full-text-search )
210
- - [ Dynamic Indices] ( https://elasticsearch.pdphilip.com/dynamic-indices )
244
+ - [ The Base Model] ( https://elasticsearch.pdphilip.com/eloquent/the-base-model )
245
+ - [ Saving Models] ( https://elasticsearch.pdphilip.com/eloquent/saving-models )
246
+ - [ Deleting Models] ( https://elasticsearch.pdphilip.com/eloquent/deleting-models )
247
+ - [ Querying Models] ( https://elasticsearch.pdphilip.com/eloquent/querying-models )
248
+ - [ Eloquent Queries] ( https://elasticsearch.pdphilip.com/eloquent/eloquent-queries )
249
+ - [ ES Eloquent Queries] ( https://elasticsearch.pdphilip.com/eloquent/es-queries )
250
+ - [ Cross Fields Search Queries] ( https://elasticsearch.pdphilip.com/eloquent/search-queries )
251
+ - [ Aggregation Queries] ( https://elasticsearch.pdphilip.com/eloquent/aggregation )
252
+ - [ Distinct and GroupBy Queries] ( https://elasticsearch.pdphilip.com/eloquent/distinct )
253
+ - [ Nested Queries] ( https://elasticsearch.pdphilip.com/eloquent/nested-queries )
254
+ - [ Ordering and Pagination] ( https://elasticsearch.pdphilip.com/eloquent/ordering-and-pagination )
255
+ - [ Chunking] ( https://elasticsearch.pdphilip.com/eloquent/chunking )
256
+ - [ Dynamic Indices] ( https://elasticsearch.pdphilip.com/eloquent/dynamic-indices )
211
257
212
- ## Relationships
258
+ ### Relationships
213
259
214
- - [ Elasticsearch to Elasticsearch] ( https://elasticsearch.pdphilip.com/es-es )
215
- - [ Elasticsearch to MySQL ] ( https://elasticsearch.pdphilip.com/es-mysql )
260
+ - [ Elasticsearch to Elasticsearch] ( https://elasticsearch.pdphilip.com/relationships/ es-es )
261
+ - [ Elasticsearch to SQL ] ( https://elasticsearch.pdphilip.com/relationships/ es-sql )
216
262
217
- ## Schema/Index
263
+ ### Migrations: Schema/Index
218
264
219
- - [ Migrations] ( https://elasticsearch.pdphilip.com/migrations )
220
- - [ Re-indexing Process ] ( https://elasticsearch.pdphilip.com/re-indexing )
265
+ - [ Migrations] ( https://elasticsearch.pdphilip.com/schema/ migrations )
266
+ - [ Index Blueprint ] ( https://elasticsearch.pdphilip.com/schema/index-blueprint )
221
267
222
- ## Misc
268
+ ### Misc
223
269
224
- - [ Handling Errors ] ( https://elasticsearch.pdphilip.com/handling-errors )
270
+ - [ Mapping ES to Eloquent ] ( https://elasticsearch.pdphilip.com/notes/elasticsearch-to-eloquent-map )
225
271
226
- ---
227
-
228
- # New in Version 4
229
-
230
- (and 3.9.1/3.8.1)
231
-
232
- - [ Search Highlighting] ( https://elasticsearch.pdphilip.com/full-text-search#highlighting )
233
- - [ whereTimestamp()] ( https://elasticsearch.pdphilip.com/es-specific#where-timestamp )
234
- - [ Raw Aggregation] ( https://elasticsearch.pdphilip.com/es-specific#raw-aggregation-queries )
235
- - [ Updated Error Handling] ( https://elasticsearch.pdphilip.com/handling-errors )
236
- - [ Chunk Upgrade: Point In Time (PIT)] ( https://elasticsearch.pdphilip.com/chunking#chunking-under-the-hood-pit )
237
-
238
- ---
272
+ ## Credits
239
273
240
- # New in Version 3
274
+ - [ David Philip] ( https://github.com/pdphilip )
275
+ - [ @use-the-fork ] ( https://github.com/use-the-fork )
241
276
242
- ### Nested Queries [ (see)] ( https://elasticsearch.pdphilip.com/nested-queries )
243
-
244
- - [ Nested Object Queries] ( https://elasticsearch.pdphilip.com/nested-queries#where-nested-object )
245
- - [ Order By Nested] ( https://elasticsearch.pdphilip.com/nested-queries#order-by-nested-field )
246
- - [ Filter Nested Values] ( https://elasticsearch.pdphilip.com/nested-queries#filtering-nested-values ) : Filters nested values of the parent collection
247
-
248
- ### New ` Where ` clauses
249
-
250
- - [ Phrase Matching] ( https://elasticsearch.pdphilip.com/es-specific#where-phrase ) : The enhancement in phrase matching capabilities allows for refined search precision, facilitating the targeting of exact word sequences within textual
251
- fields, thus improving search specificity
252
- and relevance.
253
- - [ Exact Matching] ( https://elasticsearch.pdphilip.com/es-specific#where-exact ) : Strengthening exact match queries enables more stringent search criteria, ensuring the retrieval of documents that precisely align with specified parameters.
254
-
255
- ### Sorting Enhancements
256
-
257
- - [ Ordering with ES features] ( https://elasticsearch.pdphilip.com/ordering-and-pagination#extending-ordering-for-elasticsearch-features ) : Includes modes and missing values for sorting fields.
258
- - [ Order by Geo Distance] ( https://elasticsearch.pdphilip.com/ordering-and-pagination#order-by-geo-distance )
259
-
260
- ### Saving Updates
261
-
262
- - [ First Or Create] ( https://elasticsearch.pdphilip.com/saving-models#first-or-create )
263
- - [ First Or Create without Refresh] ( https://elasticsearch.pdphilip.com/saving-models#first-or-create-without-refresh )
264
-
265
- ### Grouped Queries
266
-
267
- - [ Grouped Queries] ( https://elasticsearch.pdphilip.com/querying-models#grouped-queries ) : Queries can be grouped allowing multiple conditions to be nested within a single query block.
268
-
269
- ---
277
+ ## License
270
278
271
- ### Roadmap
272
- - Add Global modifer on model to add a * , or an index modifer to end of the table. that way you can do global search or add to a sub index.
279
+ The MIT License (MIT). Please see [ License File] ( LICENSE.md ) for more information.
0 commit comments