3

我正在尝试使用 elasticsearch 进行按接近度排序的搜索。我安装了 FOSElasticaBundle,我的 config.yml 上有这个配置:

fos_elastica:
    clients:
        default: { host: localhost, port: 9200 }
    serializer:
        callback_class: FOS\ElasticaBundle\Serializer\Callback
        serializer: serializer
    indexes:
        productos:
            client: default
            settings:
                index:
                  analysis:
                        analyzer:
                            default:
                                type: spanish
                                tokenizer: icu_tokenizer
                                filter: [ icu_folding, my_ngram ]
                        filter:
                            my_ngram:
                                type: "nGram"
                                min_gram: 2
                                max_gram: 25
            types:
                producto:
                    mappings:
                        nombre: { boost: 5 }
                        descripcion: { boost: 3 }
                    persistence:
                        driver: orm
                        model: Gupost\BackendBundle\Entity\Producto
                        listener:
                        provider: ~
                        finder: ~
        comercios:
            client: default
            settings:
                index:
                  analysis:
                        analyzer:
                            default:
                                type: spanish
                                tokenizer: icu_tokenizer
                                filter: [ icu_folding, my_ngram ]
                        filter:
                            my_ngram:
                                type: "nGram"
                                min_gram: 2
                                max_gram: 25
            types:
                comercio:
                    mappings:
                        nombrecomercio: { boost: 5 }
                        razonsocial: { boost: 5 }
                        location: {type: geo_point}

                    persistence:
                        driver: orm
                        model: Gupost\BackendBundle\Entity\Comercio
                        listener:
                        provider: ~
                        finder: ~

索引已正确构建,如果我执行此查询:

curl -XGET 'http://localhost:9200/comercios/comercio/_search' -d '{
    "query": {
        "filtered" : {
            "query" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "100m",
                    "location" : {
                        "lat" : -2.1741771697998047,
                        "lon" : 43.28249657890983
                    }
                }
            }
        }
    }

}'

我得到了一些结果。问题是当我试图从我的控制器中获取结果时。
我怎样才能做到这一点?我试过这个:

<?php

namespace Acme\ApiBundle\Controller;

use Elastica\Query\Filtered;
use FOS\RestBundle\Controller\Annotations\NamePrefix;       // NamePrefix Route annotation class @NamePrefix("bdk_core_user_userrest_")
use FOS\RestBundle\View\RouteRedirectView;                  // Route based redirect implementation
use FOS\RestBundle\View\View AS FOSView;                    // Default View implementation.
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\ConstraintViolation;
use FOS\RestBundle\Request\ParamFetcher;
use FOS\RestBundle\Controller\Annotations\RequestParam;
use Elastica\Filter\GeoDistance;
use Elastica\Query;
use Elastica\Query\MatchAll;
//use Elastica\Query\F
/**
 * Controller that provides Restful sercies over the resource Users.
 *
 * @NamePrefix("api_rest_comercios")
 */
class ComerciosRestController extends Controller
{

    public function getgeocomerciosAction() {
        $view = FOSView::create();
        $finder = $this->container->get('fos_elastica.finder.comercios.comercio');

        $query = new Query();

        $filter = new GeoDistance('location', array('lat' => -2.1741771697998047,
             'lon' => 43.28249657890983), '100m');
        $all = new Query(new MatchAll());
        $query = new Filtered($all, $filter);

        $data = $query->toArray();
        ladybug_dump( $data );
        $query->setRawQuery($data);
        $entities = $finder->find($query);
        // $results = $index->search($query);

        if ($entities) {
            $view->setStatusCode(200)->setData($entities);
        }
        return $view;
    }
}

但它不起作用。我收到此错误:

可捕获的致命错误:传递给 Elastica\Query\Filtered::__construct() 的参数 1 必须是 Elastica\Query\AbstractQuery 的实例,给定的 Elastica\Query 的实例,在 /Users/gitek/www/merkaklub/src/Gupost 中调用/ApiBundle/Controller/ComerciosRestController.php 在第 92 行并在 /Users/gitek/www/merkaklub/vendor/ruflin/elastica/lib/Elastica/Query/Filtered.php 第 36 行定义

任何帮助或线索?

4

1 回答 1

4

正确的代码是

$query = new Filtered(new MatchAll(), $filter);

作为\Elastica\Query\MatchAll扩展AbstractQuery\Elastica\Query是一种名称相当混乱的客户端。

于 2013-09-24T11:55:02.840 回答