0

我有一个带有 ngram 分析器的复杂索引。我希望能够通过 Java API 创建一个新索引。我目前正在为此使用 Kotlin,但使用相同的框架。我为此索引创建了架构,如下所示:

 {
  "settings": {
    "index": {
      "max_ngram_diff": 20,
      "search.idle.after": "10m"
    },
    "analysis": {
      "analyzer": {
        "ngram3_analyzer": {
          "tokenizer": "ngram3_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "ngram3_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 20
        }
      }
    }
  },
  "mappings": {
    "dynamic": "strict",
    "_doc": {
      "properties": {
        "name": {
          "type": "keyword",
          "fields": {
            "partial": {
              "type": "text",
              "analyzer": "ngram3_analyzer",
              "search_analyzer": "keyword"
            },
            "text": {
              "type": "text"
            }
          }
        },
        "location": {
          "type": "geo_shape",
          "ignore_malformed": true
        },
        "type": {
          "type": "keyword"
        },
        "sort": {
          "type": "integer"
        }
      }
    }
  }
}

此 json 模式在通过休息客户端 PUT 调用手动传递时有效。

    {
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "new_index_created"
    }

使用以下 koltin 函数通过弹性 Java API 传递相同的模式:

private fun createIndex(index: String, schema: String) {
    val createIndexRequest = CreateIndexRequest(index).mapping(schema, XContentType.JSON)
    getClient().indices().create(createIndexRequest, RequestOptions.DEFAULT)
}

我得到这个回应:

Elasticsearch exception [type=mapper_parsing_exception, reason=Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:  [settings : {index={max_ngram_diff=20, search.idle.after=10m}, analysis={analyzer={ngram3_analyzer={filter=[lowercase], tokenizer=ngram3_tokenizer}}, tokenizer={ngram3_tokenizer={min_gram=3, type=ngram, max_gram=20}}}}] [mappings : {_doc={properties={name={type=keyword, fields={text={type=text}, partial={search_analyzer=keyword, analyzer=ngram3_analyzer, type=text}}}, location={ignore_malformed=true, type=geo_shape}, sort={type=integer}, type={type=keyword}}}, dynamic=strict}]]

在这个问题上的任何帮助都会很棒:)

4

1 回答 1

1

您得到的错误是因为您将两者都传递mappingssettings调用mapping(...)

您可以mapping()仅使用该mappings部分和setting()使用该settings部分进行调用,也可以source()像这样调用:

val createIndexRequest = CreateIndexRequest(index).source(schema, XContentType.JSON)
                                                      ^
                                                      |
                                                  change this
于 2021-01-07T10:40:37.267 回答