2016-11-07 133 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); 
    } 
} 

请试试这个,并告诉我是否有错误