Elasticsearch关闭index的自动日期检测

笔者使用Elasticsearch时遇到了这样一个问题。将mongodb中的历史数据导入到Elasticsearch,成功导入部分数据后报错:

org.elasticsearch.client.ResponseException: method [PUT], host [http://localhost:9200],
 URI [mongodatabase/user/5ab8a173b107e818709b203c], status line [HTTP/1.1 400 Bad Request]
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse [field294]"}],
"type":"mapper_parsing_exception","reason":"failed to parse [field294]",
"caused_by":{"type":"illegal_argument_exception","reason":"Invalid format: \"\""}},"status":400}

用head查看发现报错提示的字段因为部分字符串是日期格式,被识别为了日期类型,但是这个字段并不全是日期格式的字符串,部分是空字符串,所以就报错了。

查阅官方文档得知可以设置关闭自动日期检测,但是文档中给出的例子是关闭一个指定type自动日期检测的,没有说明如何关闭index的自动日期检测。好在另一处说明了每个index有一个默认type,叫做"_default_",是所有type的原型。那么只要指定这个type关闭自动日期检测,新建的每个type就都会关闭自动日期检测了。

设置方式如下:(这里还设置了中文分词器,因为index只能在创建时设置一次,所有的设置需要放一起发送)



PUT my_index
{
  "mappings": {
    "_default_": {
      "date_detection": false
    }
  }

}

这样设置后,再导入就不会进行自动日期检测啦。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Elasticsearch进行自动补全,可以使用Elasticsearch的Completion Suggester功能。Completion Suggester是一种特殊类型的字段,它可以用于实现自动补全功能。下面是使用Java代码实现Elasticsearch自动补全的示例: 1. 首先,你需要在Java项目中添加Elasticsearch的Java客户端库。你可以在Maven或Gradle中添加以下依赖项: ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>8.0.0</version> </dependency> ``` 2. 创建Elasticsearch的Java客户端: ```java RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); ``` 3. 创建索引和映射: ```java CreateIndexRequest request = new CreateIndexRequest("my_index"); client.indices().create(request, RequestOptions.DEFAULT); PutMappingRequest mappingRequest = new PutMappingRequest("my_index"); mappingRequest.source("{\"properties\":{\"suggest\":{\"type\":\"completion\"}}}", XContentType.JSON); client.indices().putMapping(mappingRequest, RequestOptions.DEFAULT); ``` 4. 添加文档: ```java IndexRequest indexRequest = new IndexRequest("my_index"); indexRequest.id("1"); indexRequest.source("{\"suggest\":{\"input\":[\"apple\", \"banana\", \"orange\"]}}", XContentType.JSON); client.index(indexRequest, RequestOptions.DEFAULT); ``` 5. 执行自动补全查询: ```java SearchRequest searchRequest = new SearchRequest("my_index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); SuggestionBuilder suggestionBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("app"); SuggestBuilder suggestBuilder = new SuggestBuilder(); suggestBuilder.addSuggestion("my-suggestion", suggestionBuilder); searchSourceBuilder.suggest(suggestBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); CompletionSuggestion suggestion = searchResponse.getSuggest().getSuggestion("my-suggestion"); List<CompletionSuggestion.Entry.Option> options = suggestion.getOptions(); for (CompletionSuggestion.Entry.Option option : options) { String text = option.getText().string(); System.out.println(text); } ``` 这是一个简单的示例,演示了如何使用Elasticsearch的Java客户端实现自动补全功能。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值