通过Eclipse运行java弹性搜索查询。在测试时出现此错误,我无法在API中找到告诉我如何将此字段数据设置为true的任何位置
IllegalArgumentException [在文本字段上禁用Fielddata 默认。在[created]上设置fielddata = true以便加载fielddata 通过反转倒置索引来记忆。但请注意,这可以 使用重要记忆。或者,也可以使用关键字字段。]
有谁知道如何解决这个问题?
答案 0 :(得分:1)
您必须修改索引映射属性:
try (XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()) {
final XContentBuilder builder = jsonBuilder
.startObject()
.startObject("your_type")
.startObject("properties")
.startObject("your_field")
.field("type", "text")
.field("fielddata", true)/*setting fielddata*/
.endObject()
.endObject()
.endObject()
.endObject();
client.admin().indices().preparePutMapping("your_index")
.setType("your_type")
.setSource(builder)/*also there are overloads for setSource()*/
.get();
}
或强>
String source = "{\"your_type\":{\"properties\":{\"your_field\":{\"type\":\"text\",\"fielddata\":true}}}}";
client.admin().indices().preparePutMapping("your_index)
.setType("your_type")
.setSource(source, XContentType.JSON)
.get();
<强>结果:强>
{
"your_index": {
"aliases": {},
"mappings": {
"your_type": {
"properties": {
...
...
"your_field": {
"type": "text",
"fielddata": true,
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
...
...
}
}
}
}
}
答案 1 :(得分:0)
在Elasticsearch 5.0中,String
字段分为两部分 - Text
和Keyword
。如果该属性应该被分析,则您希望将String
字段迁移到Text
,如果不是,则将其迁移到Keyword
。
查看你的类型映射 - 如果你有这样的属性 -
{
"your_field": {
"type" "string",
"index": "not_analyzed"
}
}
你想把它转换成这个 -
{
"your_field": {
"type" "keyword",
"index": true
}
}
同样地,如果你的财产应该被分析,你就像这样 -
{
"your_field": {
"type" "string",
"index": "analyzed"
}
}
然后你想把它转换成这个 -
{
"your_field": {
"type" "text",
"index": true
}
}
的详情
答案 2 :(得分:0)
我最近遇到了此问题,但就我而言,执行排序时遇到了此问题。
link的摘录
默认情况下,大多数字段都已编入索引,这使它们可搜索。但是,脚本中的排序,聚合和访问字段值需要与搜索不同的访问模式。
默认情况下,文本字段中的字段数据是禁用的。
我们可以通过两种方法解决这个问题
1。通过在fielddata
字段上将text
的{{1}}启用为"fielddata": true
PUT your_index/_mapping
{
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
}
2。将.keyword
作为your_field.keyword
附加到字段以进行汇总,排序。
在以前的方法中,我们必须执行重新索引编制,这有时对于大索引来说是一个繁琐的过程。对于此类情况,以下解决方案将是更易于实施的解决方案。
ES查询:
GET /your_index/_search
{
"query": {
"match_all": {}
},
"sort":[
{
"your_field.keyword":{
"order":"asc"
}
}
]
}
Java代码
SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//Appending the .keyword to the sorting field
FieldSortBuilder fieldSortBuilder = SortBuilders.fieldSort("your_field"+".keyword");
fieldSortBuilder.order(SortOrder.ASC);
searchSourceBuilder.sort(fieldSortBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);