ElasticSearch中的父子关系-在所有子文档中搜索句子

时间:2019-05-30 20:11:12

标签: elasticsearch search mapping parent-child

我是Elastic Search的新手。我有一个用例,似乎可以通过父子关系解决。上级文档包含非政府组织的描述。子文档包含发送给NGO的各种反馈。

Parent Doc structure
{
    name
    address
    description
}

Child doc
{
    feedbackContent
}

比方说,NGO-A 4个反馈(意味着4个子文档)

  • 最佳老师

  • 最好的设施

  • 好学生

  • 位置太远

另一个NGO-B有2个反馈(意味着2个子文档)

  • 良好的食品品质

  • 很棒的位置

客户端应该能够查询传递了查询字符串中所有术语的NGO。示例-客户搜索 “最佳”和“位置”。

由于best存在于child1和child2中,而location存在于孩子4中,因此NGO-A是有效的输出。但是,由于NGO-B child2包含一个搜索词,而另一个搜索词在其他任何子文档中都不存在,因此NGO-B不是有效的结果。

我阅读了文档-https://blog.mimacom.com/parent-child-elasticsearch/,该文档相当不错,但无法断定是否可以做到这一点。

我尝试过的例子

PUT message_index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "mapping.single_type": true
  },
  "mappings": {
    "doc": {
      "properties": {
        "ngo": {"type": "text"},
        "feedback": {"type": "text"},
        "ngo_relations": {
          "type": "join",
          "relations": {
            "ngo": "feedback"
          }
        }
      }
    }
  }
}

POST message_index/doc/_bulk
{"index": {"_id":1}}
{"name":"teach for india", "ngo_relations": {"name":"ngo"}}
{"index":{"_id":2}}
{"name":"hope for autism", "ngo_relations": {"name":"ngo"}}

PUT message_index/doc/3?routing=1
{"feedback":"best food","ngo_relations":{"name":"feedback", "parent":1}}

PUT message_index/doc/4?routing=1
{"feedback":"average location","ngo_relations":{"name":"feedback", "parent":1}}

PUT message_index/doc/5?routing=1
{"feedback":"awesome staff","ngo_relations":{"name":"feedback", "parent":1}}

PUT message_index/doc/6?routing=2
{"feedback":"best teachers","ngo_relations":{"name":"feedback", "parent":2}}

PUT message_index/doc/7?routing=2
{"feedback":"awesome overload","ngo_relations":{"name":"feedback", "parent":2}}

为了获得最佳和位置搜索,请只为印度NGO教书。

没有点击:

GET message_index/_search
{
  "query": {
    "has_child": {
      "type": "feedback",
      "query": {
        "bool": {
          "must": {
            "term": {"feedback": "best"}
          },
          "must": {
            "term": {"feedback": "location"}
          }
        }
      }
    }
  }
}

两个文件都被退回

GET message_index/_search
{
  "query": {
    "has_child": {
      "type": "feedback",
      "query": {
        "bool": {
          "should": {
            "term": {"feedback": "best"}
          },
          "should": {
            "term": {"feedback": "location"}
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

这可以做到。您接近查询中的一个小错误。

在子查询中,您要执行两个必须/应该的布尔运算。因此,您的查询是:给我所有文件,使他们拥有一个孩子,以便该孩子同时拥有“最佳”和“位置”这两个词(或在应有的情况下为“其中一个”)。

您想要的是:给我所有文件,使他们有一个孩子,使该孩子拥有“最佳”一词,并且也有一个孩子,使该孩子具有“地点”一词。

按以下方式调整您的查询:

GET message_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "term": {
                "feedback": "best"
              }
            }
          }
        },
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "term": {
                "feedback": "location"
              }
            }
          }
        }
      ]
    }
  }
}