Elasticsearch - 通过 java API 执行但不是手动创建索引失败

问题描述

我有一个带有 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 模式在通过 rest 客户端 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}]]

对此问题的任何帮助都会很棒:)

解决方法

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

您可以仅使用 mapping() 部分调用 mappings,使用 setting() 部分调用 settings,或者您可以像这样调用 source():>

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...