我很想知道是否可以在ElasticSearch中设置索引结构和查询,以便在尽可能少的查询中实现以下操作。
让我们定义一下系统中存在的一些东西。
id
,tone
, date
。有一些全文元素,但它们已经全部处理过了idReport
id
- idReport
映射,可以有一个可选的第三个字段:tone
的覆盖我们系统中的关键障碍是关联链接中存在的tone
需要覆盖文档中存在的所有方面的tone
,但不能替换它。有些报告可能认为文件是积极的,而其他报告则认为文件是中立的,甚至是积极的。
我在考虑将报告链接存储为文档中的嵌套字段。实际上,文件如下:
{
id: integer,
tone: integer,
reports: [
{ id: integer,
tone: integer
}
]
}
关键问题在于,是否有可能在一个查询中无缝覆盖嵌套字段中存在的任何内容。如果没有,那么最好的前进方式是什么?
答案 0 :(得分:2)
可以在1次查询中使用script fields。
我要做的是将嵌套报告重组为对象,如下所示:
{
id: integer,
tone: integer,
reports: {
idA: {
tone: integer
} ,
idB: {
tone: integer
}
}
}
然后有一个像这样的查询,它将'toneWithFallback'作为包含所需内容的字段返回:
{
"query" : {
...
},
"script_fields" : {
"toneWithFallback" : {
"script" : "_source.reports[reportId].empty || _source.reports[reportId].tone.empty ? _source.reports[reportId].tone: _source.tone ",
"params" : {
"reportId" : "<theIdAsAString>"
}
}
}
}