elasticsearch-通过JavaAPI而不是手动创建索引时失败

kknvjkwl  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(425)

我有一个复杂的索引和ngram分析器。我希望能够通过javaapi创建一个新索引。我目前正在使用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"
        }
      }
    }
  }
}

当通过rest客户机put调用手动传递json模式时,这个json模式可以工作。

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

在这个问题上有任何帮助都会很好:)

kmpatx3s

kmpatx3s1#

你犯的错误是因为你两个都通过了 mappings 以及 settings 进入 mapping(...) 打电话。
你可以打电话 mapping() 只有 mappings 剖面图和 setting()settings 或者你可以打电话 source() 这样地:

val createIndexRequest = CreateIndexRequest(index).source(schema, XContentType.JSON)
                                                      ^
                                                      |
                                                  change this

相关问题