2013-12-10 54 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