我正在研究Java代码,以便在ElasticSearch上创建索引和查询。 尝试使用count,sort API时,我不断收到此异常:
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true ......
如何将Fielddata设置为true?
我使用BulkRequest创建索引,如何将映射添加到BulkRequest?
以下是创建索引的代码:
BulkRequest request=new BulkRequest();
try {
BufferedReader br=new BufferedReader(new FileReader(fileName));
String line;
while((line=br.readLine())!=null) {
request.add(new IndexRequest(indexName, type).source(line, XContentType.JSON)); ;
BulkResponse bulkresp=client.bulk(request);
afterBulk(request,bulkresp);
}
catch (IOException e) {
e.printStackTrace();
}
答案 0 :(得分:0)
首先,让我们转到问题的根源,你想对文本字段进行排序操作,这需要你启用fielddata。
在启用fielddata之前,请考虑使用文本字段的原因 用于聚合,排序或脚本。它通常不会 这样做的意义。
在编制索引之前会分析文本字段,以便像纽约这样的值 可以通过搜索新或 york 找到。术语聚合 当您执行此字段时,将返回新存储桶和约克存储桶 可能想要一个名为纽约的桶。
排序的情况也是如此。你如何在这个有很多术语的领域进行排序。
相反,您应该有一个 text 字段用于全文搜索,并且 未经分析的关键字字段,其中 doc_values 已启用聚合, 如下
{
"mappings": {
"_doc": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
对于问题的其他部分 - 您需要查看CreateIndexRequest
,它允许明确指定映射。最有可能的是,现在你正在使用动态的,这就是为什么fielddata会给你带来问题的原因。有关如何使用CreateIndexRequest的更多信息 - https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-create-index.html#java-rest-high-create-index
答案 1 :(得分:0)
感谢您回答我的问题。 我想对日期字段进行排序,但我没有将映射添加到索引,所有字段都自动设置为文本。 将映射添加到索引后,问题得以解决。