在所有父字段和子字段上将Elasticsearch设置为AND

时间:2013-12-10 15:34:33

标签: elasticsearch

可以在一组条款中搜索所有父/子作为OR,其中任何父文档或子文档包含任何搜索词,如下所示:

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

但是如何搜索这样我返回父文档,其中父文档字段及其所有子文档字段的联合包含搜索项的并集?也就是说,所有条款都包含在父文档或其子文档中?

2 个答案:

答案 0 :(得分:2)

你做不到。

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

如果进行非规范化,则可以获得此行为。例如,将所有子项都放在父文档中。然后,您可以只搜索父文档中的术语联合,并使用父/子关系进行任何其他过滤/搜索。

答案 1 :(得分:0)

这很昂贵,但如果您可以通过编程方式构建查询,则看起来可以使用过滤完成。

{
  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"
            }
          }
        }
      }
    }
  }
}