一架梯子,一头程序猿,仰望星空!

php elasticsearch 搜索详解


本章主要讲解php Elasticsearch的搜索的写法,大体上php Elasticsearch的写法还是跟elasticsearch查询语法保持一致,区别就是elasticsearch使用的是json结构,需要转换成php数组。

如果不熟悉elasticsearch查询语法和相关概念,可以先看看elasticsearch查询语法教程,这里不再重复。

下面通过一些例子对比下,elasticsearch查询语法和php的写法之间的区别

php es查询语法差异

es查询语法

curl -XGET 'localhost:9200/my_index/_search' -d '{
    "query" : {
        "match" : {
            "testField" : "abc"
        }
    }
}'

转换成php后的写法

$params = [
    'index' => 'my_index', // 索引名
     //body保存es 请求体内容, 这里的内容跟es查询语法保持一致,区别就是需要转成php数组格式
    'body'  => [ 
        // 这里的内容跟上面查询语法一致
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

// 通过search执行查询请求。
$results = $client->search($params);

提示:php elasticsearch的查询语法跟elasticsearch查询语法完全一致,只要将json格式转换成php数组即可, 详情参考:elasticsearch查询语法

处理搜索结果

$params = [
    'index' => 'my_index',
    'body'  => [
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

$results = $client->search($params);

// 下面处理查询结果
$milliseconds = $results['took']; // 获取请求执行时间,单位毫秒
// 获取匹配的最大分值
$maxScore     = $results['hits']['max_score'];

// 获取匹配的文档结果,是一个文档列表,建议打印出来看看
$list = $results['hits']['hits'];

复杂的查询例子

es查询例子

curl -XGET 'localhost:9200/my_index/_search' -d '{
    "query" : {
        "bool" : {
            "filter" : {
                "term" : { "my_field" : "abc" }
            },
            "should" : {
                "match" : { "my_other_field" : "xyz" }
            }
        }
    }
}'

转换成php代码

$params = [
    'index' => 'my_index', // 索引名
    'body'  => [ // es 请求体,下面的内容,仔细跟上面对比下,完全一致
        'query' => [
            'bool' => [
                'filter' => [
                    'term' => [ 'my_field' => 'abc' ]
                ],
                'should' => [
                    'match' => [ 'my_other_field' => 'xyz' ]
                ]
            ]
        ]
    ]
];


$results = $client->search($params);

分页

$params = [
    'index' => 'my_index', // 索引名
    'from' => 0, // 分页参数, 开始偏移配置
    'size' => 100, // 分页参数 - 分页大小,默认 10
    'body'  => [// es查询条件
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

// 通过search执行查询请求。
$results = $client->search($params);

排序

$params = [
    'index' => 'my_index', // 索引名
    'from' => 0, // 分页参数, 开始偏移配置
    'size' => 100, // 分页参数 - 分页大小,默认 10
    'sort' => [ // 设置排序条件, 支持多个排序字段
        'shop_id' => [ // 排序字段
            'order' => 'desc' // 排序方向: asc升序,desc降序
        ]
    ],
    'body'  => [// es查询条件
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

// 通过search执行查询请求。
$results = $client->search($params);