我是否必须指定映射才能在 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:

我不明白这背后发生了什么。只有一种情况被视为错误是否正常?我正在处理查询部分,错误不是来自我的 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 核心的开发者