ElasticSearch正则表达式过滤器regex dash

6
我在我的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之类的变量。
我可以使用以下 ElasticSearch 查询来实现这个功能:
{
  "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解析库。 - Braj
在字符类中使用“-”例如[-] - Avinash Raj
1
这实际上是由一个JSON解析库生成的,但它不起作用。 - bonez
2个回答

8

问题:

这是因为默认分析器通常会在 - 处进行分词,所以你的字段很可能保存为:

  • 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>

添加新映射的API,使用原始SKU如下:

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

链接:


1
谢谢您的答复,它真的很有帮助。实际上我是在搜索Elasticsearch的GitHub bug列表,并开始深入研究分析和非分析路径。 - bonez
很高兴能帮忙 :) 在创建 facets(现在称为聚合,在1.*中)时,我也遇到了同样的问题。 - Sam
1
该死!你救了我们!:) - ZedTuX

3
这也可以通过以下查询实现(在字段旁使用 .keyword )
"regexp": {
"sku.keyword": "md01575254-40.*"
}

这对我很有帮助。谢谢。 - Jin Tan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接