Elasticsearch自动完成整数字段

时间:2015-12-23 21:14:39

标签: elasticsearch autocomplete prefix

我正在尝试在数字字段上实现自动完成功能(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],而term1,那么我希望从ES获取带有密钥{{{ 1}}。

问题是这似乎不适用于数字字段。对于上面的示例,我收到一个包含密钥[1, 15, 151]的存储桶,如果1term,我将获得一个包含密钥15的存储桶,即仅返回完全匹配。相比之下,它适用于15类型的字段。

我猜我需要string的一些特殊映射,但我更喜欢让映射尽可能通用,同时让自动完成工作对映射进行最小的更改(只需注意 - 索引)我查询可能是一个通用的,在我的应用程序外部,所以只有在新映射是通用和标准的情况下,我才能够更改其中的类型/字段映射。

我有什么选择?

1 个答案:

答案 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查询