首页 > 解决方案 > Elasticsearch - 如何为摄取管道中的内部字段提供价值

问题描述

我创建了一个索引,其映射如下所示:

{
  "corona_data_search_ac_poc" : {
    "mappings" : {
      "properties" : {
        "Country" : {
          "type" : "text"
        },
        "Date" : {
          "type" : "text"
        },
        "IsImplicitIntent" : {
          "type" : "boolean"
        },
        "PopularityScore" : {
          "type" : "long"
        },
        "Query" : {
          "type" : "text",
          "fields" : {
            "query_suggest" : {
              "type" : "completion",
              "analyzer" : "simple",
              "preserve_separators" : true,
              "preserve_position_increments" : true,
              "max_input_length" : 50
            }
          }
        }
      }
    }
  }
}

示例文档如下所示:

{"Date": "01-01-2020", "Query": "coronavirus is deadly", "IsImplicitIntent": true, "Country": "United States", "PopularityScore": 1}

我正在使用Query.query_suggest自动完成。为此,我Query使用摄取管道中的脚本生成该字段的后缀列表。例如,如果"Query": "coronavirus is deadly", 那么 "Query.query_suggest"应该是这样的:

"query_suggest" : {
   "input" : [
      "coronavirus is deadly",
      "is deadly",
      "deadly"
    ]
}

现在,我可以使用以下脚本生成后缀列表:

{
  "script": {
     "source": """
        def tokens = new ArrayList(Arrays.asList(/\s+/.split(ctx.Query)));
        def nbTokens = tokens.size();
        def input = [];
        for (def i = nbTokens; i > 0; i--) {
           input.add(tokens.join(" "));
           tokens.remove(0);
        }
    
        # how to assign the list to the inner field?
        ctx.Query.query_suggest = [
          'input': input
        ]
        """
  }
}

我不确定如何将列表分配给内部字段(请参阅上面脚本中的注释),以便 ES 可以在该数据之上构建自动完成图?

注意:如果我在映射中定义query_suggest相同的级别,然后像在脚本中Query那样分配值,那么它工作正常。ctx.query_suggest

标签: elasticsearch

解决方案


您的字段映射Query不正确。您将无法索引您期望的内容,因为查询字段是类型text并且不会接受建议字段所需的相同输入,它们必须是单独的字段。

您需要在顶层有两个单独的字段:

    "Query" : {
      "type" : "text"
    },
    "Query_Suggest": {
      "type" : "completion",
      "analyzer" : "simple",
      "preserve_separators" : true,
      "preserve_position_increments" : true,
      "max_input_length" : 50
    }

然后索引这个:

PUT test/_doc/1?pipeline=my-pipeline
{
  "Query": "coronavirus is deadly"
}

将产生这个:

{
  "Query" : "coronavirus is deadly",
  "Query_Suggest" : {
    "input" : [
      "coronavirus is deadly",
      "is deadly",
      "deadly"
    ]
  }
}

推荐阅读