elasticsearch - 对特定的嵌套文档进行范围查询
问题描述
我有这样的文档结构。对于以下两个文档,我们有嵌套文档,称为交互信息。我只需要获取具有标题持续时间且其值大于60的文档
{
"key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
"interactionInfo": [
{
"title": "duration",
"value": "11"
},
{
"title": "timetaken",
"value": "9"
},
{
"title": "talk_time",
"value": "145"
}
]
},
{
"key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
"interactionInfo": [
{
"title": "duration",
"value": "120"
},
{
"title": "timetaken",
"value": "9"
},
{
"title": "talk_time",
"value": "60"
}
]
}
]
是否可以仅获取具有标题的文档:持续时间并且它们的值大于 60。嵌套文档中的值属性是文本和关键字。
解决方案
您的解决方案中几乎没有基本错误,为了利用范围查询(即查找具有超过 60 个值的文档,您需要将它们存储为您的案例中的整数)。
另请参阅具有类似示例的官方指南。
让我向您展示如何执行此操作的分步示例。
索引定义
{
"mappings" :{
"properties" :{
"interactionInfo" :{
"type" : "nested"
},
"key" : {
"type" : "keyword"
}
}
}
}
索引示例文档
{
"key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
"interactionInfo": [
{
"title": "duration",
"value": 120. --> note, not using `""` double quotes which would store them as integer
},
{
"title": "timetaken",
"value": 9
},
{
"title": "talk_time",
"value": 60
}
]
}
{
"key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
"interactionInfo": [
{
"title": "duration",
"value": 11
},
{
"title": "timetaken",
"value": 9
},
{
"title": "talk_time",
"value": 145
}
]
}
搜索查询
{
"query": {
"nested": {
"path": "interactionInfo",
"query": {
"bool": {
"must": [
{
"match": {
"interactionInfo.title": "duration"
}
},
{
"range": {
"interactionInfo.value": {
"gt": 60
}
}
}
]
}
}
}
}
}
以及您预期的搜索结果
"hits": [
{
"_index": "nestedsoint",
"_type": "_doc",
"_id": "2",
"_score": 2.0296195,
"_source": {
"key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
"interactionInfo": [
{
"title": "duration",
"value": 120
},
{
"title": "timetaken",
"value": 9
},
{
"title": "talk_time",
"value": 60
}
]
}
}
]
推荐阅读
- multithreading - Delphi:当与来自另一个线程的数据交互时,如何使 VCL 控件成为线程安全的?
- java - IntelliJ - 解决 Maven 工件
- javascript - 如何使用 JavaScript 附加 HTML 代码?
- xaml - nuget 中的 UWP 样式和主题找不到资源文件
- openapi - Swagger codegen:生成具有正确名称的数组元素
- java - 通过终端使用 jasypt 加密简单字符串
- android - 如何查找 Android 类引入了哪个 API 级别?
- reactjs - 在反应中从另一个钩子调用钩子
- c++ - std::filebuf 打开文件,如果不存在则创建
- python - BeautifulSoup 允许我抓取一些文章,但不能抓取其他文章(来自同一份报纸)