当前位置: 首页 > 面试题库 >

ElasticSearch RegExp过滤器正则破折号

耿和韵
2023-03-14
问题内容

我的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
  • 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 Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press- release-1 。为了尝试正确使用我现在使用的正则表达式,但这最终将与用户的查询字符串一起使用。 POST到localhos

  • 问题内容: 我正在寻找一种将虚线控制器和方法名称路由到实际带下划线的控制器和方法名称的线路。 例如网址 将路由到 参见:http : //codeigniter.com/forums/viewreply/696690/,这使我想到了:) 问题答案: 这也正是我的要求,而且我使用了类似 在我之前的项目中,我需要创建300-400路由规则,其中大多数是由于短划线到下划线的转换。 对于我的下一个项目,我

  • 问题内容: 我目前正在网站上,遇到这种奇怪的行为。我不确定这是一个错误还是如何解决它,所以我想向您寻求帮助。 因此,我有这个标题屏幕的“动画”,该标题的标题位于全屏页面的中央,当您向下滚动时,标题变小并保留在页面顶部。这是一个具有预期行为的工作示例,从中我剥离了所有不必要的代码以使其最小化: 接下来是完全相同的代码段,但有一个附加代码段:我应用了一个过滤器,就我而言,这纯粹是装饰性的:。 正如您在

  • 注意:我在Chrome应用程序中使用来自webview的YouTubeIframe。 这是YouTube的API声明: videoSyndicated参数允许您将搜索限制为只能在youtube.com以外播放的视频。如果为此参数指定值,还必须将type参数的值设置为video。 videoLicense参数过滤搜索结果,以仅包括具有特定许可证的视频。YouTube允许视频上传者选择将知识共享许可或

  • 问题内容: 我想在Java中构建一个正则表达式,该正则表达式将在FilenameFilter中传递以过滤目录中的文件。 问题是我无法理解正则表达式“思维模型”的问题:) 这是我用来选择要排除的文件的正则表达式 (((ABC | XYZ))+ \ w * Test.xml 我想做的是选择所有以Test.xml结尾但不以ABC或XYZ开头的文件。 您能否添加任何可以帮助我应对正则表达式的资源。 谢谢

  • 问题内容: 我正在尝试过滤包含一堆URL的数组。我需要返回仅包含“联系人”一词的网址。 例如,有一个链接 这应该从过滤器中返回。 我尝试了这个: 当我知道有一个包含“联系人”一词的域时,它目前仅通过所有域发送回false。 问题答案: 首先,它等于哪里是退格字符(ASCII 08)…显然不是您想要的 所以,你会做的-这相当于 但是,之后是多余的 所以…到 在这里使用被滥用。以下是说明 下一个问题是