【问题标题】:Elasticsearch - how to provide value to an inner field in ingest pipelineElasticsearch - 如何为摄取管道中的内部字段提供价值
【发布时间】:2021-09-14 10:24:15
【问题描述】:

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

{
  "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


    【解决方案1】:

    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"
        ]
      }
    }
    

    【讨论】:

    • 正如我已经提到的,如果我在同一级别创建两个字段,那么它可以工作。当我在“查询”字段下嵌套“query_suggest”时,我正在寻找一种方法。当“query_suggest”是“query”的内部字段时,是否可以实现相同的目标。您知道使用内部字段实现相同结果的任何其他方法吗?
    • 不,这是不可能的,因为Query 字段需要一个字符串,而completion 字段需要一个不同的输入。如果您在两个字段中索引相同的数据(即字符串coronavirus is deadly)是可能的,但是由于您对完成字段的需求不同,它不起作用,您需要两个不同的字段
    • 采用在同一级别创建两个字段的解决方案。
    • 酷,很高兴它有帮助!
    • 还有一个疑问,是否可以使用自定义分析器生成句子的后缀?我很想看到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2022-08-24
    • 2021-10-04
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多