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

问题描述 投票:0回答:2

我对 Elastic Search 非常陌生。我有一个用例似乎可以通过父子关系来解决。父文档包含非政府组织的描述。子文档包含发送给非政府组织的各种反馈。

Parent Doc structure
{
    name
    address
    description
}

Child doc
{
    feedbackContent
}

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

  • 最好的老师

  • 最好的设施

  • 好学生

  • 位置太远

另一个 NGO-B 有 2 条反馈(即 2 个子文件)

  • 食物品质好

  • 很棒的位置

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

由于

best
存在于 child1 和 child2 中,并且
location
存在于 child 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}}

对于最佳和位置搜索,应返回为印度非政府组织授课。

没有点击:

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"}
          }
        }
      }
    }
  }
}
elasticsearch search mapping parent-child
2个回答
1
投票

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

在您的子查询中,您正在执行带有两个必须/应该的布尔值。因此,您的查询是:给我所有文件,以便他们有一个孩子,这样孩子就同时拥有(或“应该”的“其中一个”)术语“最佳”和“位置”。

然而,你想要的是:给我所有文件,证明他们有一个孩子,这个孩子有“最好”这个词,还有一个孩子,这个孩子有“位置”这个词。

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

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

0
投票

您可以按如下方式优化查询

GET message_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "feedback": "best"
                    }
                  },
                  {
                    "term": {
                      "feedback": "location"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.