我有项目,在每个项目中我都有任务,在每个任务中我都有评论。所以它看起来像:
-> 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
}
}
}
]
}
}
}
但在这里我有问题:
- 我没有得到我想要的结果,在 inner_hits 中,我得到了搜索评论,而在 doc 结果中,我得到了所有任务,所以我必须使用来自评论的 task_id 过滤任务(因为我想要任务)。有没有一个好的方法可以做到这一点,因为我认为这种方法不好继续。
- 对于 inner_hits,我们不能获得超过 150 条记录,因为这是它的最大限制。
请让我知道我该怎么做。谢谢