chenyuanqi/elasticsearch

v1.0.0 2017-05-09 08:04 UTC

README

This package depends on "elasticsearch/elasticsearch" and it provides a unified API across a variety of different full text search services.

Notice: Test for elasticsearch 2.x, even than 5.x; whatever, some function cannot take effect for the low one.

The following dependencies are needed for the listed search drivers:

{
"php": ">=7.0",
"illuminate/support": "~5.1",
"elasticsearch/elasticsearch": "~5.0"
}

Structure

├── Commands
│   └── ElasticsearchService.php
├── config
│   └── elasticsearch.php
├── Analyze.php
├── Builder.php
├── Query.php
├── SearchFacade.php
└── SearchServiceProvider.php

Suggestion

For safety reasons, please install the plugin: shield
For search effectively, these plugins may be useful for you:
1、head
2、bigdesk
3、kopt
4、sql
5、ik
6、pinyin
7、同义词
8、简繁转换

Install

You can edit composer.json file, in the require object:

{
"chenyuanqi/elasticsearch": "dev-master"
}

Or use composer command:

composer require chenyuanqi/elasticsearch

After that, run composer update to install this package.
Actually, it was finished but in laravel5 that you still let the service provider to app/config/app.php, within the providers array.

'providers' => [
	// elasticsearch service
	chenyuanqi\elasticsearch\SearchServiceProvider::class,
],

Add a class alias to app/config/app.php, within the aliases array.

'aliases' => [
	// elasticsearch service facade
	'Search' => chenyuanqi\elasticsearch\SearchFacade::class,
],

Configure

In laravel5, publish the default config file to your application then make modifications as you can.

php artisan vendor:publish

However, default config file is config/elasticsearch.php.

Laravel Usage

1、search for create index

Search::createIndex();

Notice: Index name must be lowercase.

2、search for mapping due to config

Search::createMapping();
Search::updateMapping();
Search::deleteMapping();

3、search for select index and type

Search::index('test')->type('test');

Notice: Here index and type has default value.

4、search for insert data

$data = [
    'name'  => 'Kyyomi',
    'age'   => 18,
    'birth' => '2017-03-03'
];
// However, you can set id for the record. For instance, "Search::insert($data, 1);"
Search::insert($data);

5、search for update data

Here provide two way for update data,

$data = [
    'birth' => '1999-03-03'
];
// update by id
Search::updateById($data, 1);
// update by query
Search::queryString('name:"Kyyomi"')->update($data);

By the way, use update by query must open the script setting

# In elasticsearch 2.3.3, allow script operate
  script.inline: true
  script.indexed: true
  script.file: true
  script.engine.groovy.inline.update: true
  script.engine.groovy.inline.aggs: true

6、search for increase or decrease data

Search::queryString('name:"海盗之王"')->increase('age');
Search::queryString('name:"海盗之王"')->increase('age', 2);
Search::queryString('name:"海盗之王"')->decrease('age', 3);

Like update by query, increase or decrease also open the script setting

7、search for delete data

Here provide two way for delete data,

$data = [
    'birth' => '1999-03-03'
];
// delete by id
Search::deleteById(1);
// delete by query, not support for version >2.0 (consider plugin: delete-by-query) 
Search::queryString('name:"Kyyomi"')->delete();

8、search for clean index

Search::truncate();

9、search for bulk

$data = [
    [
        'index',
        '_id'  => 1,
        'name' => 'viki',
        'age'  => 18
    ],
    [
        'create',
        '_id'  => 2,
        'name' => 'lucy',
        'age'  => 15
    ],
    [
        'update',
        '_id'  => 1,
        'name' => 'vikey',
        'age'  => 28
    ],
    [
        'delete',
        '_id' => 2
    ]
]
Search::bulk($data);

Notice: Default handle is 'index'.

10、everything is for search

You can select fields show for search.

Search::pluck(['name', 'age'])->search();

Default paging is true and show the result first ten, If you don't need it

Search::pluck(['name', 'age'])->search(false);

Construct the conditions with queryString, just like that

Search::queryString('name=Kyyomi');

Or the conditions with filter

Search::filter('status', 'show');

Or the conditions with ids

Search::ids([1, 2, 3]);
// If other field with in or not in function
Search::whereIn('name', ['A', 'B', 'C']);
Search::whereNotIn('name', ['A', 'B', 'C']);

Or the conditions with match

Search::match('name', 'Kyyomi', 'match');
Search::match(['name', 'age'], 'Kyyomi', 'multi_match');
Search::match('Kyyomi');

Or the conditions with term

Search::term('name', 'Kyyomi');

Or the conditions with bool

// The third parameter include must(default value), must_not, should, filter.
Search::bool('name', 'Kyyomi', 'must_not');

Or the conditions with null

Search::isNull('name');
// If need the field is not null
Search::isNotNull('name');

Or the conditions with aggregation

Search::max('id');
Search::min('id');
Search::sum('id');
Search::avg('id');

Or the conditions with range

Search::range('age', [7, 18], ['gt', 'lte']);

However, the range query has fourth parameter which use as extra action.
Or the conditions with where query

Search::where('id', '=', 100)->search();
// The same as last sentence
Search::where('id', 100)->search();
Search::where('id', '=', 100)->orWhere('age', '>=', 18)->search();
// Also, we can use like query
Search::where('name', 'like', '%天天%')->search();
// any more where function like whereBetween, whereNotBetween
Search::whereBetween('id', [1, 2]);

Here are two ways When we need paging.

// paging style
Search::queryString('name:"珍珠海盗"')->limit(0, 10)->search();
// scroll style
Search::queryString('name:"珍珠海盗"')->scroll(1000, '30s', 'scan')->search();
// If you want use scroll id for search or delete it
Search::searchByScrollId('xxx');
Search::deleteByScrollId('xxx');

And count the record, just use the count function.

Search::queryString('name:"珍珠海盗"')->count();

At last, use the debug function that output the debug message as you need.

Search::queryString('name:"珍珠海盗"')->search();
Search::debug();
// If you need curl sentence, do it
Search::toCurl();

Notice: you must output the message after search.

Others Usage

You know, it uses the facade design pattern above all of laravel usage.
So in here, just replace the Search object like that:

use chenyuanqi\elasticsearch\Builder;
$search = new Builder(false);

All right, Happy hacking~