Elasticsearch 自动完成整数字段

Elasticsearch autocomplete integer field

我正在尝试在数字字段上实现自动完成功能(它在 ES 中的实际类型是 long)。

我在客户端使用 jQuery UI 自动完成小部件,它的 source 函数使用前缀词向 Elasticsearch 发送查询以获取数字(例如, 5) 自动完成选项。

我正在使用的查询如下所示:

{
    "size": 0,
    "query": {
        "prefix": {
            "myField": "<term>"
        }
    },
    "aggs": {
        "myAggregation": {
            "terms": { 
                "field": "myField",
                "size": 5
            }
        }
    }
}

这样如果 myField 具有不同的值:[1, 15, 151, 21, 22],并且 term1,那么我希望从 ES 获得带键的桶[1, 15, 151].

问题是这似乎不适用于数字字段。对于上面的例子,我得到一个带有键 1 的桶,如果 term15 我得到一个带有键 15 的桶,即它只returns 完全匹配。相反,它非常适合 string 类型的字段。

我猜我需要为 myField 做一些特殊的映射,但我希望映射尽可能通用,同时让自动完成功能对映射进行最少的更改(请注意 -我正在查询的索引可能是一个通用索引,在我的应用程序外部,因此只有在新映射是通用和标准的情况下,我才能更改其中的 type/field 映射。

我有哪些选择?

我要做的是在您的整数字段中创建一个 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聚合上和其他字段需要 运行 prefix 查询的字符串值。