我正在尝试在数字字段上实现自动完成功能(ES中的实际类型为long
)。
我在客户端使用jQuery UI Autocomplete小部件,让它的source
函数向Elasticsearch发送一个带有前缀term的查询,以获得一个(例如5个)自动完成选项。
我使用的查询类似于以下内容:
{
"size": 0,
"query": {
"prefix": {
"myField": "<term>"
}
},
"aggs": {
"myAggregation": {
"terms": {
"field": "myField",
"size": 5
}
}
}
}
如果myField
具有不同的值:[1, 15, 151, 21, 22]
,而term
是1
,那么我希望从ES获取带有密钥{{{ 1}}。
问题是这似乎不适用于数字字段。对于上面的示例,我收到一个包含密钥[1, 15, 151]
的存储桶,如果1
为term
,我将获得一个包含密钥15
的存储桶,即仅返回完全匹配。相比之下,它适用于15
类型的字段。
我猜我需要string
的一些特殊映射,但我更喜欢让映射尽可能通用,同时让自动完成工作对映射进行最小的更改(只需注意 - 索引)我查询可能是一个通用的,在我的应用程序外部,所以只有在新映射是通用和标准的情况下,我才能够更改其中的类型/字段映射。
我有什么选择?
答案 0 :(得分:2)
我要做的是在整数字段中创建一个string
子字段,如下所示:
{
"myField": {
"type": "integer",
"fields": {
"to_string": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
然后您的查询需要更改为下面的查询,即查询字符串字段,但从整数字段中检索术语聚合
{
"size": 0,
"query": {
"prefix": {
"myField.to_string": "1"
}
},
"aggs": {
"myAggregation": {
"terms": {
"field": "myField",
"size": 5
}
}
}
}
注意你也可以创建一个完全独立的字段,不需要子字段,关键点是一个字段需要整数值来运行terms
聚合而另一个字段需要字符串值在。{/ p>上运行prefix
查询