【问题标题】:ElasticSearch RegExp Filter regex dashElasticSearch RegExp 过滤器正则表达式破折号
【发布时间】:2014-09-16 09:16:19
【问题描述】:

我的 ElasticSearch v1.2.1 中有一些文档,例如:

{
  "tempSkipAfterSave": "false",
  "variation": null,
  "images": null,
  "name": "Dolce & Gabbana Short Sleeve Coat",
  "sku": "MD01575254-40-WHITE",
  "user_id": "123foo",
  "creation_date": null,
  "changed": 1
}

其中sku 可以是一个变体,例如:MD01575254-40-BlUEMD01575254-38-WHITE

我可以让我的弹性搜索查询使用这个:

{
  "size": 1000,
  "from": 0,
  "filter": {
    "and": [
      {
        "regexp": {
          "sku": "md01575254.*"
        }
      },
      {
        "term": {
          "user_id": "123foo"
        }
      },
      {
        "missing": {
          "field": "project_id"
        }
      }
    ]
  },
  "query": {
    "match_all": {}
  }
}    

我得到了 sku 的所有变体:MD01575254*

但是,破折号'-'真的把我搞砸了

当我将正则表达式更改为:

"regexp": {
  "sku": "md01575254-40.*"
}

我无法返回任何结果。我也试过了

  • “sku”:“md01575254-40.*”
  • “sku”:“md01575254\-40.*”
  • “sku”:“md01575254-40-.*”
  • ...

似乎无法让它工作?我在这里没有错吗?

【问题讨论】:

  • 使用任何 JSON 解析库。
  • - 放入 char 类中,例如 [-]
  • 这实际上是从 json 解析库生成的,[-] 不起作用

标签: regex lucene elasticsearch


【解决方案1】:

问题:

这是因为默认分析器通常标记在-,因此您的字段最有可能保存为:

  • MD01575254
  • 40
  • BlUE

解决方案:

您可以更新您的映射,使其具有一个在编制索引时不会被分析的sku.raw 字段。这将要求您删除并重新编制索引。

{
  "<type>" : {
    "properties" : {
      ...,
      "sku" : {
        "type": "string",
        "fields" : {
          "raw" : {"type" : "string", "index" : "not_analyzed"}
        }
      }
    }
  }
}

然后就可以查询这个没有被分析的新字段了:

{
  "query" : {
    "regexp" : {
      "sku.raw": "md01575254-40.*"
    }
  }
}

HTTP 端点:

删除当前映射和数据的 API 是:

DELETE http://localhost:9200/<index>/<type>

使用原始 SKU 添加新映射的 API 是:

PUT http://localhost:9200/<index>/<type>/_mapping

链接:

【讨论】:

  • 感谢您的帮助,我实际上只是在搜索 elasticsearch github 错误列表,并开始走上分析与非分析的道路
  • 很高兴能帮上忙 :) 我在创建构面时遇到了同样的问题(现在在 1.* 中称为聚合)。
  • 该死的!你救了我们! :)
【解决方案2】:

这也可以通过下面的查询来实现。 (在字段旁边使用.keyword

"regexp": {
"sku.keyword": "md01575254-40.*"
}

【讨论】:

  • 这对我有帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多