ElasticSearch RegExp过滤器正则表达式破折号

时间:2014-07-24 17:20:48

标签: regex lucene elasticsearch

我的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 - 。*"
  • ...

似乎无法让它发挥作用?我在这里做错了什么?

2 个答案:

答案 0 :(得分:6)

<强>问题:

这是因为默认分析器通常会在-进行标记,因此您的字段最像保存:

  • 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

<强>链接:

答案 1 :(得分:0)

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

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