我正在从2.x迁移到5.x. 我正在为这个
添加索引值indexInto (indexName / indexType) id someKey source foo
但是我还想按字段获取所有值:
def getValues(tag: String) ={
client execute {
search(indexName / indexType) query ("_field_names", tag) aggregations (termsAggregation( "agg") field tag size 1)
}
但我得到了这个例外:
RemoteTransportException [[8vWOLB2] [172.17.0.5:9300] [指数:数据/读取/搜索[相位/查询]]]; 嵌套:IllegalArgumentException [在文本字段上禁用Fielddata 默认情况下。在[my_tag]上设置fielddata = true以加载fielddata 在内存中通过反转指数。请注意,这可以 然而,使用重要的记忆。];
我认为可能使用keyword
如here所示,但这些字段在高级中不知道(由用户发送),所以我不能使用perpend映射
答案 0 :(得分:1)
默认情况下,所有未知字段都将作为未在映射中指定的文本字段编入索引/添加到elasticsearch。 如果你要看一下这样一个字段的映射,你可以看到有一个字段被启用了类型为'keyword'的字段,这些字段被索引但没有被分析。
GET new_index2/_mappings
{
"new_index2": {
"mappings": {
"type": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
因此您可以使用文本字段的字段值进行聚合,如下所示
POST new_index2/_search
{
"aggs": {
"NAME": {
"terms": {
"field": "name.fields",
"size": 10
}
}
}
}
检查name.fields
因此,如果您可以切换到字段值,则可以使用scala查询。
def getValues(tag: String) = {
client.execute {
search(indexName / indexType)
.query("_field_name", tag)
.aggregations {
termsAgg("agg", "field_name.fields")
}.size(1)
}
}
希望这会有所帮助。 感谢