ElasticSearch索引拓扑 - 字段覆盖

时间:2014-04-19 22:15:39

标签: elasticsearch

我很想知道是否可以在ElasticSearch中设置索引结构和查询,以便在尽可能少的查询中实现以下操作。

让我们定义一下系统中存在的一些东西。

  • 文档包含大量与其来源,数据类型等相关的信息。为简化起见,我们将为其提供三个字段:idtonedate。有一些全文元素,但它们已经全部处理过了
  • 报告包含大量与搜索查询相关的信息。出于我们的目的,它们是分开存放的。他们也有一个id,我们称之为idReport
  • 剪辑报告文档之间的链接。它表示为id - idReport映射,可以有一个可选的第三个字段:tone的覆盖

我们系统中的关键障碍是关联链接中存在的tone需要覆盖文档中存在的所有方面的tone,但不能替换它。有些报告可能认为文件是积极的,而其他报告则认为文件是中立的,甚至是积极的。

我在考虑将报告链接存储为文档中的嵌套字段。实际上,文件如下:

 {
   id: integer,
   tone: integer,
   reports: [
      { id: integer,
        tone: integer
      }
   ]
 }

关键问题在于,是否有可能在一个查询中无缝覆盖嵌套字段中存在的任何内容。如果没有,那么最好的前进方式是什么?

1 个答案:

答案 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>"
                }
            }
        }
   }

您还可以通过脚本filtersortfacet