2013-12-10 111 views
0

人们可以搜索所有父/子在一组术语作为的或其中任何父或子文件中包含任何搜索项,像这样:获取Elasticsearch来和所有的父母子女领域

query: 
    bool: 
    should: 
     match: 
     _all: "term1 term2" 
     has_child: 
     type: childtype1 
     query: 
      match: 
      _all: "term1 term2" 

但我该如何搜索,以便返回父文档字段与其所有子文档字段的联合包含搜索字词联合的父文档?也就是说,这些条款的所有都包含在父文档中或其子文档之一中?

回答

-1

这很昂贵,但它看起来像可以使用筛选完成,如果您可以编程构建您的查询。

{ 
    query: { 
    filtered: { 
     filter: { 
     and: [ 
      { 
      or: [ 
       { 
       term: { 
        _all: term1 
       } 
       }, { 
       has_child: { 
        type: childtype1, 
        query: { 
        term: { 
         _all: term1 
        } 
        } 
       } 
       } 
      ], 
      or: [ 
       { 
       term: { 
        _all: term2 
       } 
       }, { 
       has_child: { 
        type: childtype1, 
        query: { 
        term: { 
         _all: term2 
        } 
        } 
       } 
       } 
      ] 
      } 
     ] 
     } 
    }, 
    bool: { 
     should: { 
     match: { 
      _all: "term1 term2" 
     }, 
     has_child: { 
      type: childtype1, 
      query: { 
      match: { 
       _all: "term1 term2" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
1

你不能。

您一次只能对一个文档强制执行设置限制。父母和孩子彼此独立地进行评估(他们是独立的文件),这意味着没有办法要求所有条款在父母和孩子之间传播的文件。所有条款或者需要在父母或者孩子身上,否则你必须容忍一些缺失的条款。

如果您非规范化,则可以得到此行为。例如,将所有子项置于父文档中。然后,您可以搜索条目联合的父文档,并使用父/子关系执行任何其他过滤/搜索。

+0

谢谢!我一直在想,在执行搜索之后,必须有一些方法来过滤ES侧上的聚合搜索文档。 – Brett

+0

这在理论上是可行的,但目前不支持(并且可能是非常昂贵的操作)。查询后获取搜索执行的方式可以防止这种情况变得很容易。 – Zach

+0

我有一个想法,并在过滤后的查询中将一些OR组合在一起,并且它看起来像预期的那样工作,并且对于我的数据集来说并不是非常昂贵,所以我打算继续这样做。 – Brett