chenyuanqi/elasticsearch

elasticsearch Laravel 服务

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

This package is not auto-updated.

Last update: 2024-09-27 23:44:06 UTC


README

此包依赖于 "elasticsearch/elasticsearch",并为各种不同的全文搜索服务提供统一的 API。

注意:测试了 elasticsearch 2.x,甚至 5.x;无论如何,某些功能在低版本中可能无法生效。

以下搜索驱动器需要以下依赖项

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

结构

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

建议

出于安全考虑,请安装插件:shield
为了有效地搜索,以下插件可能对您有所帮助
1、head
2、bigdesk
3、kopt
4、sql
5、ik
6、pinyin
7、同义词
8、简繁转换

安装

您可以在 composer.json 文件中编辑 require 对象

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

或使用 composer 命令

composer require chenyuanqi/elasticsearch

然后,运行 composer update 来安装此包。
实际上,在 laravel5 中,您仍然需要将服务提供者添加到 app/config/app.php 的 providers 数组中。

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

在 app/config/app.php 的 aliases 数组中添加一个类别名。

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

配置

laravel5 中,将默认配置文件发布到您的应用程序,然后进行修改。

php artisan vendor:publish

但是,默认配置文件是 config/elasticsearch.php

Laravel 使用方法

1、创建索引的搜索

Search::createIndex();

注意:索引名称必须为小写。

2、由于配置进行映射搜索

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

3、搜索索引和类型

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

注意:这里索引和类型有默认值。

4、搜索插入数据

$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、搜索更新数据

这里提供两种更新数据的方式,

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

顺便说一下,使用 update by query 必须打开脚本设置

# 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::queryString('name:"海盗之王"')->increase('age');
Search::queryString('name:"海盗之王"')->increase('age', 2);
Search::queryString('name:"海盗之王"')->decrease('age', 3);

类似于 update by query,增加或减少也打开脚本设置

7、搜索删除数据

这里提供两种删除数据的方式,

$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::truncate();

9、搜索批量处理

$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);

注意:默认处理是 'index'。

10、一切都是为了搜索

您可以选择显示的字段进行搜索。

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

默认分页为 true,显示前十个结果。如果您不需要它

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

使用 queryString 构造条件,就像这样

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

或使用 filter 构造条件

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

或使用 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']);

或使用 match 构造条件

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

或使用 term 构造条件

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

或使用 bool 构造条件

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

或使用 null 构造条件

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

或使用聚合构造条件

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

或使用范围构造条件

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

然而,范围查询有第四个参数,用作额外操作。
或者使用带where条件的查询

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]);

当需要分页时,这里有两种方法。

// 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');

只需使用count函数来计数记录。

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

最后,使用调试函数输出所需的调试信息。

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

注意:必须在搜索之后输出信息。

其他用法

你知道,它首先使用上面提到的laravel用法
所以在这里,只需像这样替换Search对象

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

好的,快乐黑客时间~