【问题标题】:Typescript object not passed properly to elasticsearchTypescript 对象未正确传递给 elasticsearch
【发布时间】:2017-03-03 00:55:42
【问题描述】:

我在 typescript 中有一个函数,它以弹性搜索查询的形式将对象写入我的 firebase 的“搜索/请求”路径。

在 Heroku 上运行 flashlight 的脚本会读取 firebase 中的“search/request/XYZ”对象,然后在执行搜索后创建“search/response/XYZ”对象。

在我的应用中,以下 sn-p 可以正常工作:

    let queryBody: Object = {
    index: 'firebase',
    type: 'vehicle',
    query: { match_all: {} },
    size: 4
}
this.requestKey = this._allSearchRequest$.push(queryBody).key

执行时,firebase 中的响应对象正确指示“97 个命中”并显示其中的前 4 个。

但是,我无法执行更复杂的查询。我尝试执行以下 sn-p,尝试根据车辆的 vin 属性匹配所有车辆:

    let queryBody: Object = {
    index: 'firebase',
    type: 'vehicle',
    query: { match: {vin: '*'} },
    size: 4
}
this.requestKey = this._allSearchRequest$.push(queryBody).key

但是当我这样做时,我收到以下错误,“搜索必须包含字符串或对象”。

elasticsearch 的文档是用 javascript 编写的,所有键都使用双引号。 Typescript 不使用该语法。我怀疑将 typescript 对象转换为 javascript 到 json 可能存在问题。

我调试的下一步将是尝试使用 ElasticSearch 文档指定的确切格式创建显式 JSON 对象。

在此期间任何想法都会有所帮助。

【问题讨论】:

  • 我向你保证,它与 TypeScript 无关。顺便说一句,它完全支持双引号键和所有其他 JavaScript 语法。你忘了打电话给JSON.stringify吗?
  • 顺便说一句,只能使用序列化程序或使用字符串操作手动创建 JSON 对象。这是因为 JSON 是一种文本数据交换格式,而不是内存对象模型。在 JavaScript 中,所有 JSON 值都是字符串类型的成员。
  • 您需要在此处使用qbody 而不是query。如前所述,这与打字稿无关,与不喜欢您的查询语法的节点的 ES 库有关。
  • @Kato,为什么qbodyquery 更受欢迎?

标签: angular typescript elasticsearch firebase firebase-realtime-database


【解决方案1】:

我的解决方案是将queryq 属性值设为字符串。例如,下面的 sn -p 将匹配所有 vin 属性以“1GC”开头的对象。

let queryBody: Object = {
    index: 'firebase',
    type: 'vehicle',
    query: 'vin:1GC*'
}
this.requestKey = this._allSearchRequest$.push(queryBody).key;

请注意,在上面的示例中,this._allSearchRequest$ 是一个 FireBase List Observable per angularfire2。我不知道这种“字符串”方法是否适合更复杂的查询。

Flashlight repo 中的示例客户端脚本中显示了更强大的方法。它似乎传递了一个对象而不是一个字符串。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多