使用Elasticsearch在Laravel中搜索查询的逻辑

时间:2015-02-24 08:58:06

标签: php mysql search laravel elasticsearch

我正在使用Laravel与Elasticsearch一起搜索表格/类型。

我总共有5个搜索过滤器供用户搜索。

标题(字符串) - 类型(布尔值) - 州名(int) - 城市名称(int) - 价格(整数)

因此查询可以有31种不同的组合。

由于我不能在这里使用像Eloquent ORM这样的东西,我需要为ES编写每个查询。

有更好的方法吗?

或者是否有一些Laravel包可以让我做这样的事情 - 留下一些搜索参数为空,只让ES拿起那些不空的人。

'filtered' => [
                'query' => [
                    'match' => ['title' => Input::get('query')]
                ],
                'filter'=> [
                    'bool' => [
                        'must' => [
                            ['term' => [ 'type' =>  1] ],
                            ['term' => [ 'state' =>  22] ],
                            ['term' => [ 'city' => ] ],
                            [ 'range' => [
                                    'price' => [
                                        'gte' => ,
                                        'lte' => ,
                                    ]
                                ]
                            ]
                        ]
                    ]
                ],
            ],

1 个答案:

答案 0 :(得分:0)

你见过 Elastica 吗?

http://elastica.io/example/aggregations/terms.html

这可能是最接近Elasticsearch提供类似Eloquent的接口的东西。

use Elastica\Aggregation\Terms;
use Elastica\Query;

// set up the aggregation
$termsAgg = new Terms("genders");
$termsAgg->setField("gender");
$termsAgg->setSize(10);

// add the aggregation to a Query object
$query = new Query();
$query->addAggregation($termsAgg);

// retrieve the results
$index = $elasticaClient->getIndex('someindex');
$buckets = $index->search($query)->getAggregation("genders");

最终将构建一个类似的查询:

{
    "aggs" : {
        "genders" : {
            "terms" : { "field" : "gender" },
            "size": 10
        }
    }
}