我是否必须指定映射才能在 Kuzzle 中使用 document.search 控制器?
Do I have to specify a mapping in order to use the document.search controller in Kuzzle?
我正在使用 Kuzzle 来构建一个简单的类似 slack 的应用程序。我有一个简单的集合,其中包含仅包含其他文档 ID 的文档。
我想从这个集合中查询一个 id 列表,结果在响应中遇到了一个空的 hits 数组,无论我在查询中尝试了什么 id 值。它让我阅读了有关 Elasticsearch 查询语法和映射的内容,然后我发现我需要指定一个映射。
在没有指定映射的情况下创建集合时,document.search:
returns 如果给定 "query" 正文 属性 则为空的命中数组,如下所示:
{"query": {"terms": {"id": <ids array>}}}
如果给定 "sort" 则抛出以下内容:
// {"sort": [{"id": {"order": "desc"}}]}
Error: No mapping found for [id] in order to sort on
和 returns 一个空的遗愿清单 "aggregations" 像这样:
"aggregations": {
"groupById": {
"terms": {
"field": "id"
}
}
}
我不明白这背后发生了什么。只有一种情况被视为错误是否正常?我正在处理查询部分,错误不是来自我的 ids 数组的内容并不明显!
使用 "keyword" 类型在 "id" 上添加一个简单的映射可以使所有情况都按预期工作,但我读到了 Elasticsearch 中的动态映射。有没有办法使用它们?或者是否有另一种解决方案来查询我的文档中的(唯一的)参数?
我正在使用 kuzzle-sdk v7.1.4
非常感谢!
Elasticsearch 映射是一种告诉底层引擎如何索引文档字段的方法。
例如,text field will not be indexed the same way as a keyword 字段,您将无法进行相同类型的查询。
keyword
字段被索引 "as is",因此您可以非常快速地搜索精确的术语(例如 term query) but text
fields are analyzed with various method to be able to do a fuzzy match query。
如果字段没有声明的映射,Elasticsearch 将无法在任何查询中访问它。
您可以阅读我们的Elasticsearch Cookbook了解更多信息。
关于mappings dynamic policy,默认这个策略设置为false
,意味着ES不会推断新引入的字段类型。
我们选择这个默认值是因为你不能修改字段的类型,所以最好自己定义它,而不是让 ES 推断出准确度很差的类型。
您可以为整个映射更改此策略,但也可以仅为嵌套对象更改此策略(这被认为是最佳做法)
{
"dynamic": "false",
"properties": {
"id": { "type": "keyword" },
"metadata": {
"dynamic": "true",
"properties": {
// field types will be automatically inferred in the "metadata" object
}
}
}
}
那么如果你创建如下文件:
{
"id": "your-unique-uuid",
"name": "aschen",
"metadata": {
"avatar": "http://url.com"
}
}
id
字段已经声明为keyword
,可以查询
在这个领域。
name
字段未声明,动态策略为 false
所以您不能对该字段进行查询。
metadata.avatar
字段未声明但动态策略
因为这个嵌套对象是 true
所以 ES 会添加一个 text
类型
这个字段,你可以查询这个字段。
最后一件事,您在文档中使用了一个 id
字段,但 Elasticsearch 已经为每个文档生成了唯一标识符 (_id
),因此您可能想改用它。
我是 Kuzzle 核心的开发者
我正在使用 Kuzzle 来构建一个简单的类似 slack 的应用程序。我有一个简单的集合,其中包含仅包含其他文档 ID 的文档。 我想从这个集合中查询一个 id 列表,结果在响应中遇到了一个空的 hits 数组,无论我在查询中尝试了什么 id 值。它让我阅读了有关 Elasticsearch 查询语法和映射的内容,然后我发现我需要指定一个映射。
在没有指定映射的情况下创建集合时,document.search:
returns 如果给定 "query" 正文 属性 则为空的命中数组,如下所示:
{"query": {"terms": {"id": <ids array>}}}
如果给定 "sort" 则抛出以下内容:
// {"sort": [{"id": {"order": "desc"}}]} Error: No mapping found for [id] in order to sort on
和 returns 一个空的遗愿清单 "aggregations" 像这样:
"aggregations": { "groupById": { "terms": { "field": "id" } } }
我不明白这背后发生了什么。只有一种情况被视为错误是否正常?我正在处理查询部分,错误不是来自我的 ids 数组的内容并不明显!
使用 "keyword" 类型在 "id" 上添加一个简单的映射可以使所有情况都按预期工作,但我读到了 Elasticsearch 中的动态映射。有没有办法使用它们?或者是否有另一种解决方案来查询我的文档中的(唯一的)参数?
我正在使用 kuzzle-sdk v7.1.4
非常感谢!
Elasticsearch 映射是一种告诉底层引擎如何索引文档字段的方法。
例如,text field will not be indexed the same way as a keyword 字段,您将无法进行相同类型的查询。
keyword
字段被索引 "as is",因此您可以非常快速地搜索精确的术语(例如 term query) but text
fields are analyzed with various method to be able to do a fuzzy match query。
如果字段没有声明的映射,Elasticsearch 将无法在任何查询中访问它。
您可以阅读我们的Elasticsearch Cookbook了解更多信息。
关于mappings dynamic policy,默认这个策略设置为false
,意味着ES不会推断新引入的字段类型。
我们选择这个默认值是因为你不能修改字段的类型,所以最好自己定义它,而不是让 ES 推断出准确度很差的类型。
您可以为整个映射更改此策略,但也可以仅为嵌套对象更改此策略(这被认为是最佳做法)
{
"dynamic": "false",
"properties": {
"id": { "type": "keyword" },
"metadata": {
"dynamic": "true",
"properties": {
// field types will be automatically inferred in the "metadata" object
}
}
}
}
那么如果你创建如下文件:
{
"id": "your-unique-uuid",
"name": "aschen",
"metadata": {
"avatar": "http://url.com"
}
}
id
字段已经声明为keyword
,可以查询 在这个领域。name
字段未声明,动态策略为false
所以您不能对该字段进行查询。metadata.avatar
字段未声明但动态策略 因为这个嵌套对象是true
所以 ES 会添加一个text
类型 这个字段,你可以查询这个字段。
最后一件事,您在文档中使用了一个 id
字段,但 Elasticsearch 已经为每个文档生成了唯一标识符 (_id
),因此您可能想改用它。
我是 Kuzzle 核心的开发者