0


我正在为 symfony2 使用 elasticabundle,我想按距离对我正在寻找的结果进行排序我是 elasticsearch 的新手,我不知道如何启动我正在使用的查询:

$c = $this->container->get('fos_elastica.finder.cities_index.cities');
$nameQuery = new \Elastica\Query\Match();
$nameQuery->setFieldQuery('tokens', $city);
$nameQuery->setSort(array("distance" => "asc"));// I want to achieve this

谢谢你的时间

4

1 回答 1

0

这是我按照Dimitris Tsarouhas提供的示例所做的

以下设置允许按关键字过滤,按顺序过滤,并使用公式id添加所有其他过滤。$boolQuery ->addMust($yourfilter)

我们获取表单发布的关键字。这是$data['query']默认情况下我们使用它来执行搜索,从而搜索我们文件中_all列出的所有字段。config.yml为了执行此搜索,我们使用QueryString对象,因为这允许我们使用通配符。

然后我们查看变量 是否存在$data['status'],它通过一个下拉选择框出现(请注意使用 strtolower(),如果没有它,查询将不起作用 - 或者您设置自己的不区分大小写的分析器)。如果是这样,我们用它来过滤我们的结果。

默认情况下,我们还希望缩小搜索范围,只选择活跃用户。

$data = $form->getData();
$finder = $this->container->get('fos_elastica.finder.search.user');

$keyword = $data['query'];
$status= $data['status'];

$keywordQuery = new QueryString;
$keywordQuery->setQuery('*' . $keyword . '*');

$query = new Query();
$query->setQuery($keywordQuery);
$query->setSort(array('id' => array('order' => 'asc')));

$boolQuery  = new Bool();

$active= new Term();
$active->setTerm('active', true);
$boolQuery ->addMust($active);

if (!empty($status)) {
    $statusQuery = new Term();
    $statusQuery->setTerm('status', strtolower($status->getName()));
    $boolQuery ->addMust($typeQuery);
}

$query->setFilter($boolQuery);

$entities = $finder->find($query);

当然不要忘记导入必要的库:

use
    Elastica\Query\QueryString,
    Elastica\Query,
    Elastica\Filter\Bool,
    Elastica\Filter\Term
;

请记住,为了能够对字段执行操作(搜索、排序等),这些必须包含在您的config.yml. 当然,这会导致在一般搜索某个实体时自动拾取该字段。因此,如果您需要避免这种情况,但您仍然需要某些字段可供 elastica 使用。只需如下所示定义它:

user:
    mappings:
        name: ~
        surname: ~
        status: ~
        active: { include_in_all: false }
        id: { include_in_all: false }
于 2014-09-15T16:13:52.357 回答