我正在使用弹性捆绑系统用于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
感谢您的时间
答案 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 }