通过 Eclipse 运行 java 弹性搜索查询。测试时出现此错误,我在 API 中找不到任何地方告诉我如何将此字段数据设置为 true
IllegalArgumentException[默认情况下在文本字段上禁用字段数据。在 [created] 上设置 fielddata=true 以便通过反转倒排索引将 fielddata 加载到内存中。请注意,这可能会占用大量内存。或者使用关键字字段。]
有谁知道我该如何解决这个问题?
通过 Eclipse 运行 java 弹性搜索查询。测试时出现此错误,我在 API 中找不到任何地方告诉我如何将此字段数据设置为 true
IllegalArgumentException[默认情况下在文本字段上禁用字段数据。在 [created] 上设置 fielddata=true 以便通过反转倒排索引将 fielddata 加载到内存中。请注意,这可能会占用大量内存。或者使用关键字字段。]
有谁知道我该如何解决这个问题?
您必须修改索引映射属性:
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
}
}
}
...
...
}
}
}
}
}
在 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
}
}
Elasticsearch官方页面上的详细信息
我最近遇到了这个问题,但就我而言,我在执行排序时遇到了这个问题。
链接摘录
默认情况下,大多数字段都已编入索引,这使得它们可搜索。然而,在脚本中排序、聚合和访问字段值需要与搜索不同的访问模式。
默认情况下,在文本字段上禁用 Fielddata。
我们可以用两种方法解决这个问题
fielddata
1.通过启用text
字段来更新映射"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);