gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:54:25 26 4
gpt4 key购买 nike

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

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

最佳答案

问题:

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

  • MD01575254
  • 40
  • 蓝色

解决方案:

您可以更新您的映射,使其拥有一个在编制索引时不会被分析的 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

链接:

关于regex - ElasticSearch RegExp 过滤器正则表达式破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24940112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com