文档地址:
https://www.elastic.co/guide/en/elasticsearch/client/php-api/5.0/index.html
https://packagist.org/packages/elasticsearch/elasticsearch
es权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html

首先安装composer

在composer添加

{
    "require": {
        "elasticsearch/elasticsearch": "~6.0"
    }
}

composer update 安装成功

基础概念

  • 索引 : 含有相同属性的文档集合 (mysql 表)
  • 类型 : 索引可定义一个类型或多个类型,文档必须属于一个类型(类似分类)
  • 文档 : 文档是可以被索引的基本单位(mysql一条记录)
  • 分片 : 每个索引有多个分片,每个分片都是一个lucene 索引(分片在创建索引时创建,不可修改)
  • 备份 : 拷贝一份分片,就完成了分片的备份

字段类型

[图解Elasticsearch中的_source、_all、store和index属性](https://blog.csdn.net/napoay/article/details/62233031 "图解Elasticsearch中的_source、_all、store和index属性")
[es字段类型](https://blog.csdn.net/chengyuqiang/article/details/79048800 "es字段类型")

建立索引

$client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
#创建一个索引名为blogs,内含news type的索引 ,number_of_shards 分片,number_of_replicas备份
        $params = [
            'index' => 'blogs',
            'body' => [
                'settings' => [
                    'number_of_shards' => 5,
                    'number_of_replicas' => 1
                ],
                'mappings' => [
                    'news' => [
                        '_source' => [
                            'enabled' => true
                        ],
                        'properties' => [
                            'title' => [
                                'type' => 'keyword',
                            ],
                            'content' => [
                                'type' => 'text'
                            ],
                            'author' => [
                                'type' => 'keyword',
                            ],
                            'created_at' => [
                                'type' => 'date',
                                'format' => 'yyyy-MM-dd HH:mm:ss'
                            ],
                            'updated_at' => [
                                'type' => 'date',
                                'format' => 'yyyy-MM-dd HH:mm:ss'
                            ]
                        ]
                    ],
                ]
            ]
        ];
#创建索引
$es_client->indices()->create($params);

使用

 'blogs',
                'type' => 'news',
                'id' => '1',
                'body' => [
                    'title' => 'first blog',
                    'content' => 'it is a test blog',
                    'author' => 'xiaoli',
                    'created_at' => '2019-03-20 12:12:22',
                    'updated_at' => '2019-03-20 12:12:22',
                ]
            ];
$client->index($params);

#更新数据
$params = [
    'index' => 'blogs',
    'type' => 'news',
    'id' => $post['id'],
    'body' => [
        'doc' => [
        'title' =>  $post['title'],
        'content' =>  $post['content'],
        ]
    ]
];
$client->update($params);

#删除数据
$params = [
    'index' => 'blogs',
    'type' => 'news',
    'id' => $id
];
// Delete doc at /blogs/news/my_id
$client->delete($params);

#搜索,match
$json = '{
    "query" : {
        "match" : {
            "title" : "'.$keywords.'"
        }
    }
}';

$params = [
    'index' => 'blogs',
    'type' => 'news',
    'body' => $json
];
$client->search($params);

#排序
$json = '{
    "sort": { "created_at": { "order": "desc" }}
 }';
#从零开始取10条
$params = [
    'index' => 'blogs',
    'type' => 'news',
    'size' => 10,
    'from' => 0,
    'body' => $json
];
$client->search($params);

#完全匹配
$params = '{
    "query":{
        "term": {"title":"'.$keywords.'"}
    }
}';

#组合查询
{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
   }
}
must
所有的语句都 必须(must) 匹配,与 AND 等价。
must_not
所有的语句都 不能(must not) 匹配,与 NOT 等价。
should
至少有一个语句要匹配,与 OR 等价。
#
    $json = '{
            "query" : {
                "bool" : {
                    "should": [
                        {
                            "match" : { "title" : "测试" }
                        },
                        {
                            "match" : { "content" : "你好" }
                        }
                    ]
                }
            }
        }';

一个简单的service类


namespace App\Services;
use Elasticsearch\ClientBuilder;
class ElasticSearchService{

    protected $es_client;

    public function __construct()
    {
        $this->es_client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();

    }
    /*
     * 建立索引
     */
    public function createIndex($params = []){

        return $this->es_client->indices()->create($params);
    }

    /*
     * 删除索引
     */
    public function deleteIndex($params = []){

        return $this->es_client->indices()->delete($params);
    }

    /*
     * 更新索引
     */
    public function putIndex($params = []){

        return $this->es_client->indices()->putSettings($params);
    }

    /*
     *  获得索引信息
     */
    public function getIndex($params = []){

        return $this->es_client->indices()->getSettings($params);
    }

    /*
     * 插入数据
     */
    public function insertData($params = []){

        return $this->es_client->index($params);
    }

    /*
     * 批量插入数据
     */
    public function insertDatas($params = []){

        return $this->es_client->bulk($params);
    }

    /*
     * 更新数据
     */
    public function updateData($params = []){

        return $this->es_client->update($params);
    }

    /*
     * 删除数据
     */
    public function deleteData($params = []){

        return $this->es_client->delete($params);
    }

    /*
     * 搜索数据
     */
    public function searchData($params = []){

        return $this->es_client->search($params);
    }

}
?>

php使用生成器读取超大文件

<?php function getLines($file) { $f = fopen($file, 'r'); try { while ($line = fgets($f)) { yield $line; ...

阅读全文

php获取字符串里面的图片,xpath方式

代码 <?php $html = <<<str <html> <head> <title>123</title> </head> <body> <img src=&quo...

阅读全文

Thinkphp5 in查询结果按照in里面的顺序排

或许有人会注意过,但我以前真不知道 SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3,4,5,6,7,8,9,排序...

阅读全文

欢迎留言