2014-07-22 99 views
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 

感謝您的時間

回答

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 
; 

記住,要能夠對字段執行操作(搜索,排序等),這些haveto包含在您config.yml 。當然,這會在通常搜索某個實體時自動拾取該字段。因此,如果您需要避免這種情況,但您仍然需要某些字段可供elastica使用。只需將其定義爲如下所示:

user: 
    mappings: 
     name: ~ 
     surname: ~ 
     status: ~ 
     active: { include_in_all: false } 
     id: { include_in_all: false } 
相關問題