弹性搜索正则表达式查询美元范围

时间:2017-08-11 20:33:47

标签: regex elasticsearch

我正在尝试创建一个正则表达式查询,该查询将搜索我拥有的美元范围内容。

这是符合以下格式的项目:$ xxx,xxx.xx - $ xxx,xxx.xx

请注意,我希望这有点失败。唯一的要求是捕获字符串必须始终以'$'开头,后面带有数字(逗号可选),并且包含' - '分隔另一组相同格式的数字(以$开头)。

虽然我找到了一个能够满足这一要求的正则表达式,并且我相信我已经使用了弹性搜索语法,但我似乎无法获得任何结果。我知道它应该根据我对被查询数据集的了解来查找结果。

以下是查询,如果有人可以帮我弄清楚出了什么问题,或者我应该做些什么,我将不胜感激!谢谢!

GET _search
{
  "query": {
    "regexp": {
      "_content": {
        "value": "$?<1-9>{1,}(,?<0-9>{1,3})+ *- *$?<1-9>{1,}(,?<0-9>{1,3})+",
        "flags": "INTERVAL"
        }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

我手边没有Elasticsearch实例,但以下内容应符合您的美元范围:

GET _search
{
  "query": {
    "regexp": {
      "_content": {
        "value": "\$[1-9][0-9]*((,|\.)[0-9]{1,3})+ *- *\$[1-9][0-9]*((,|\.)[0-9]{1,3})+"
        }
    }
  }
}

说明

间隔期正如WiktorStribiżew所说,你错误地使用了间隔选项,AFAIK没有采用量词。您可以使用间隔,但这里简单的数值范围也可以。 [1-9][0-9]匹配一个至少有1位数的数字,而不是以0开头。

量词 {1,}可以写成+。由于我正在提取第一个范围以匹配任何数字但零,我应该使用{0,}或其等价物:*

美元符号正如我所说,你需要摆脱美元符号。这些是表示字符串结尾的特殊符号。

点分隔符每组2-3位数字可以用逗号或点分隔。 (,|\.)与两者都匹配。

答案 1 :(得分:0)

对于那些将来可能遇到类似问题的人:

我的正则表达式不正确,而是使用错误的标记生成器索引项目。用于弹性搜索的标准标记生成器剥离了$和 - 以及其他特殊字符。经过一些定制后,我设法得到一个可以返回预期结果的reg ex。这是我使用的最终查询:

GET pdfs3/pdf/_search
{
  "query": {
    "regexp": {
      "_content": "($[1-9][0-9]{0,2}(,[0-9]{3})+-$[1-9][0-9]{0,2}(,[0-9]{3}))"
    }
  }
}