【问题标题】:Find all entries on a list within Kibana via Elasticserach Query DSL在 Kibana 中查找列表中的所有条目到 Elasticsearch Query DSL
【发布时间】:2021-09-23 05:49:44
【问题描述】:

您能帮我解决这个问题吗? “发现”中的我的 Kibana 数据库包含交易列表。我知道想在这个数据库中找到所有在特定工具(ISIN 编号)中完成的交易。当我手动添加过滤器并切换到 Elasticserach Query DSL 时,我发现以下内容:

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "obdetails.isin": "CH0253592783"
          }
        },
        {
          "match_phrase": {
            "obdetails.isin": "CH0315622966"
          }
        },
        {
          "match_phrase": {
            "obdetails.isin": "CH0357659488"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

由于我想检查数据库中超过 200 个 ISINS,这似乎效率低下。有没有一种方法,我可以说“如果它包含以下 200 个 ISIN 中的一个,请告诉我交易?”。

我已经用谷歌搜索并尝试过,但没有成功:

{
  "query": {
    "terms": {
      "obdetails.isin": [ "CH0357659488", "CH0315622966"],
      "boost": 1.0
    }
  }
}

查询有效,但未显示任何结果。

【问题讨论】:

  • 您可能需要共享您的索引以帮助澄清问题。但我猜您的 obdetails.isin 是一个分析字段,可能无法按预期使用术语。添加keyword 类型的字段应该会有所帮助。
  • 你是个天才。问题解决了。非常感谢!

标签: elasticsearch kibana elasticsearch-dsl


【解决方案1】:

总结。分析text 类型的字段,它基本上使用给定的分析器等将给定数据转换为术语列表,而不是单个术语。 给定的行为会导致术语查询与这些值不匹配。

可以添加一个keyword 类型的附加字段,而不是更改字段的类型。这样,可以在执行术语查询的同时仍然能够在字段上进行匹配。

{
  "isin": {
    "type" "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}

上面的示例将添加一个名为obdetails.isin.keyword 的额外字段,可用于术语。虽然仍然可以在 obdetails.isin 上使用匹配查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多