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

 奶油。 发布于 2023-01-01 12:36

我在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-BlUE,MD01575254-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 - .*"

...

只是似乎无法使它工作?这里我没有错?

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
    

    链接:

    映射中的多个字段

    分析仪

    2023-01-01 12:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有