当前位置: 首页 > 知识库问答 >
问题:

如何通过对主文档的查询返回嵌套文档及其部分文件?

封梓
2023-03-14

我有以下关于elasticsearch的索引:

PUT /blog
{
"mappings": {
    "threadQ":{
        "properties": { 
            "title" : {
                   "type" : "string",
                   "analyzer" : "standard"
            },
            "body" : {
                   "type" : "string",
                   "analyzer" : "standard"
            },
            "posts":{
                "type": "nested",
                "properties": {
                    "comment": {
                        "type": "string",
                        "analyzer": "standard"
                    },
                    "prototype": {
                        "type": "string",
                        "analyzer": "standard"
                    },
                    "customScore":{
                        "type": "long"
                    }
                }
            }
        }
    }
}

}
我添加了一个文档:

PUT /blog/threadQ/1
{
"title": "What is c#?",
"body": "C# is a good programming language, makes it easy to develop!",
"posts": [{
    "comment": "YEP!",
    "prototype": "Hossein Bakhtiari",
    "customScore": 2
},
{
    "comment": "NEVER EVER :O",
    "prototype": "Garpizio En Larri",
    "customScore": 3
}]

}
因此,以下查询有效:

POST /blog/threadQ/_search
{
"query": {
    "bool": {
        "must": [{
            "nested": {
                "query": {
                    "query_string": {
                        "fields": ["posts.comment"],
                        "query": "YEP"
                    }
                },
                "path": "posts"
            }
        }]
    }
}

}

结果就是文档。现在要进行如下查询:

SELECT threadQ.posts.customScore FROM threadQ WHERE threadQ.posts.comment = "YEP!"   

请告诉我如何实施它。

共有2个答案

梅耘豪
2023-03-14

最后用动态模板解决了这个问题。所以新的索引结构是这样的:

PUT /my_index
{
"mappings": {
    "my_type": {
        "properties": {
            "Id":{
                "type": "integer",
                "analyzer": "standard"
            },
            "name":{
                "type": "string",
                "analyzer": "english"
            }
        }, 
        "dynamic_templates": [
            { "en": {
                  "match":              "*", 
                  "match_mapping_type": "string",
                  "mapping": {
                      "type":           "string",
                      "analyzer":       "english"
                  }
            }}
        ]
}}}

以及查询:

POST /my_index/my_type/_search
{
 "query": {
"function_score": {
  "query": {"match_all": {}},
  "functions": [
    {
      "script_score": {
        "script": "doc.apple.value * _score"
      }
    }
  ]
}
}
}

结果如下所示:

{
"took": 3,
"timed_out": false,
"_shards": {
   "total": 5,
   "successful": 5,
   "failed": 0
},
"hits": {
   "total": 3,
   "max_score": 14,
   "hits": [
      {
         "_index": "my_index",
         "_type": "my_type",
         "_id": "2",
         "_score": 14,
         "_source": {
            "Id": 2,
            "name": "Second One",
            "iphone": 20,
            "apple": 14
         }
      },
      {
         "_index": "my_index",
         "_type": "my_type",
         "_id": "3",
         "_score": 14,
         "_source": {
            "Id": 3,
            "name": "Third One",
            "apple": 14
         }
      },
      {
         "_index": "my_index",
         "_type": "my_type",
         "_id": "1",
         "_score": 1,
         "_source": {
            "Id": 1,
            "name": "First One",
            "iphone": 2,
            "apple": 1
           }
       }
    ]
 }
}
师增
2023-03-14

要返回文档中的特定字段,请使用字段或_源参数

这里使用_source

curl -XGET http://localhost:9200/blog/threadQ/_search -d '
{
"_source" : "posts.customScore",
"query": {
    "bool": {
        "must": [{
            "nested": {
                "query": {
                    "query_string": {
                        "fields": ["posts.comment"],
                        "query": "YEP"
                    }
                },
                "path": "posts"
            }
        }]
    }
  }
}'

它将返回:

"hits" : {
    "total" : 1,
    "max_score" : 2.252763,
    "hits" : [ {
      "_index" : "myindex",
      "_type" : "threadQ",
      "_id" : "1",
      "_score" : 2.252763,
      "_source":{"posts":[{"customScore":2},{"customScore":3}]}
    } ]
  }
}
 类似资料:
  • 我是elasticsearch的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?

  • 日安: 我目前有以下结构索引<代码>学校- 谢了。

  • 我有一个嵌套文档,如: 据此,https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html,以上内容应匹配: } 鉴于以下情况不应出现:, 但不幸的是两者不匹配。有什么想法吗?

  • 本文向大家介绍MongoDB查询中如何更新嵌套文档,包括了MongoDB查询中如何更新嵌套文档的使用技巧和注意事项,需要的朋友参考一下 要更新嵌套文档,请使用update(),并在其中使用点号。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新嵌套文档的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 问题内容: 我想知道为什么搜索特定术语会返回索引的所有文档,而不返回包含所请求术语的文档。 这是索引以及我的设置方法:(使用elasticsearch头插件浏览器界面) 然后我添加了一些文档: 因此,现在触发“ plaat”搜索时,人们会希望搜索会返回包含“ plaatstaal”的文档。 但是为我节省了更多的搜索,elasticsearch会恢复所有文档的大小,无论其文本内容如何。我在这里想念什

  • 我是Elasticsearch的新手,我提出了一个问题,Elasticsearch嵌套查询是否只能为嵌套字段返回匹配的嵌套文档。 对于示例,我有一个名为的类型,其中嵌套字段名为 和嵌套查询 我需要的是搜索有提到足球的评论的博客文章,每个博客文章的评论数与足球相匹配(在例子中它数为1,因为另一个评论刚刚提到篮球)。 然而,Elasticsearch似乎总是返回完整的文档,所以我如何才能实现它,或者我