2016-11-07 70 views
1

我有這種數據結構的ElasticSearch如何通過2級嵌套項目進行搜索?

[ 
    { 
     id:1, 
     translations: [ 
      { 
       language: {id:1; name: "English"}, 
       value: "How are you ?" 
      }, 
      { 
       language: {id:2; name: "French"}, 
       value: "Comment allez-vous ?" 
      }, 
      ... 
     ] 
    }, 
    ... 
] 

所以現在我想使這將是查的單詞只有英文翻譯,而不是在法國或另一個查詢。如果用戶輸入「Comment allez-vous」,他將不會看到任何結果。

,這裏是config.yml

 index_name: %es.index_name% 
     types: 
      vocabularyItem: 
       mappings: 
        translations: 
         type: "nested" 
         properties: 
          value: {boost: 5} 
          definition: {boost: 2} 
          alternativeTranslations: 
           type: "nested" 
           properties: 
            value: ~ 
          language: 
           type: "nested" 
           properties: 
            id: 
             type : integer 
       persistence: 
        driver: orm 
        model: Bundle\Model\VocabularyItem 
        provider: 
         batch_size: 100 
        listener: 
         immediate: ~ 
        finder: ~ 
+0

你好Hayk,你可以在「for_elastica:」下面顯示你的yaml映射配置嗎? – Elyass

+0

你好@Elyass,剛更新了帖子。請看看 –

+0

謝謝。請查看嵌套查詢https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html,我將爲您的問題準備一個答案 – Elyass

回答

0

首先,我建議你使用自定義庫的。這只是一個女巫搜索功能。這對保持控制器清潔很有用。

在您的彈性彎曲配置:

types: 
    vocabularyItem: 
     mappings: 
      ... 
     persistence: 
      ... 
      repository: AppBundle\SearchRepository\VocabularyItemRepository 
在控制器

然後(假設你的索引的名字被應用)

$vocabularyItemRepo = $this->get('fos_elastica.repository_manager')->getRepository('app/vocabularyItem'); 
$results = $vocabularyItemRepo->searchEnglish($keywords); 

最後是有趣的部分,與該查詢

<?php 

namespace AppBundle\SearchRepository; 

use FOS\ElasticaBundle\Repository; 
... //other use 

class VocabularyItemRepository extends Repository 
{ 
    public function searchEnglish($keywords) 
    { 
     $query = new BoolQuery(); 

     $englishQuery = new Match(); 
     $englishQuery->setField('translations.language.name', 'English'); 
     $query->addMust($englishQuery); 

     $keywordsQuery = new Match(); 
     $keywordsQuery->setField('yourKeyWordField', $keywords); 
     $query->addMust($keywordsQuery); 

     return $this->find($query); 
    } 
} 

請試試這個,並告訴我是否有錯誤