如何按距离对弹性搜索结果进行排序?

时间:2014-07-22 22:53:48

标签: foselasticabundle


我正在使用弹性捆绑系统用于symfony2,我想按距离排序我想要的结果 我是弹性搜索的新手,我不知道如何开始 我正在使用的查询:

$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

感谢您的时间

1 个答案:

答案 0 :(得分: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 }
相关问题