gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:27:49 25 4
gpt4 key购买 nike

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

Parent Doc structure
{
name
address
description
}

Child doc
{
feedbackContent
}

假设NGO-A提供了4个反馈(意味着有4个子文档)
  • 最好的老师
  • 最佳设施
  • 好学生
  • 位置太远

  • 另一个NGO-B有2个反馈(意味着2个子文档)
  • 良好的食品质量
  • 绝佳位置

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

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

    我读了doct- 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"}
    }
    }
    }
    }
    }
    }

    最佳答案

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

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

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

    调整您的查询,如下所示:

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

    关于elasticsearch - ElasticSearch中的父子关系-在所有子文档中搜索句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56385001/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com