我是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/

    10-15 22:17