1

我有项目,在每个项目中我都有任务,在每个任务中我都有评论。所以它看起来像:

-> Projects
    -> Tasks
        -> Comments

我使用嵌套文档将数据存储在弹性搜索的索引中。我的结构如下所示:

PUT projects/
{
    "mappings": {
        "properties": {
            "proj_number": {
            "type": "keyword"
        },      
        "proj_name": {
        "type": "text"
     },
     "tasks": {
         "type": "nested",
         "properties": {
         "proj_nam_id": {
             "type": "integer"
         },
         "task_name": {
             "type": "text"
         },
         "proj_tas_id": {
            "type": "integer"
         },
         "comments": {
            "type": "nested",
            "properties": {
                "proj_com_id": {
                "type": "integer"
            },
            "message": {
                "type": "text"
            },
            "task_id": {
                "type": "integer"
            },
            "proj_nam_id": {
                "type": "integer"
            }
          }
        }
      }
    }
  }
}

现在我有一个任务页面,在其中显示所有项目的所有任务,并且我想在其中添加搜索,如果用户搜索任何内容并且搜索的文本出现在任务名称或其评论中,那么我需要显示只有那些任务。

所以我希望如果从孩子那里搜索到某些东西,那么我会得到它的父母(只有那些已经搜索评论的任务或者如果它在任务名称中)。我想要的另一件事是我还有一页项目,我也需要显示所有项目并需要添加一个搜索框,如果用户搜索任何内容,我需要在项目、任务和评论中搜索,并且需要显示找到其任务或评论的项目。我曾尝试使用 inner_hits,以下是我的查询:

GET projects/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "nested": {
                        "path": "tasks",
                        "query": {
                            "bool": [
                                {
                                    "must": [
                                        {
                                            "bool": {
                                                "should": [
                                                    {
                                                        "multi_match": {
                                                            "query": "task",
                                                            "lenient": "true",
                                                            "fields": [
                                                                "tasks.task_name"
                                                            ],
                                                            "type": "best_fields",
                                                            "operator": "and"
                                                        }
                                                    }
                                                ]
                                            }
                                        }
                                    ]
                                }
                            ]
                        },
                        "inner_hits": {
                            "size": 100
                        }
                    }
                },
                {
                    "nested": {
                        "path": "tasks.comments",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "bool": {
                                            "should": [
                                                {
                                                    "multi_match": {
                                                        "query": "task",
                                                        "lenient": "true",
                                                        "fields": [
                                                            "tasks.comments.message"
                                                        ],
                                                        "type": "best_fields",
                                                        "operator": "and"
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                ]
                            }
                        },
                        "inner_hits": {
                            "size": 100
                        }
                    }
                }
            ]
        }
    }
}

但在这里我有问题:

  1. 我没有得到我想要的结果,在 inner_hits 中,我得到了搜索评论,而在 doc 结果中,我得到了所有任务,所以我必须使用来自评论的 task_id 过滤任务(因为我想要任务)。有没有一个好的方法可以做到这一点,因为我认为这种方法不好继续。
  2. 对于 inner_hits,我们不能获得超过 150 条记录,因为这是它的最大限制。

请让我知道我该怎么做。谢谢

4

0 回答 0