面对正则表达式的结果

时间:2013-07-01 11:24:16

标签: regex elasticsearch facet

我的弹性索引包含一个包含“Source”字段的文档。

{"Source": "/Bob/Test/SomeDir/1.doc"},
{"Source": "/Steve/2.doc"},
{"Source": "/Steve/3.doc"},
{"Source": "/Steve/SomePath/4.doc"}
{"Source": "/Steve/SomeOther/5.doc"}
{"Source": "/Steve/SomeOther/6.doc"}

假设来源为not_analyzed,我可以这样做:

{"query": {"wildcard": "/Steve/*"}}

获取史蒂夫的所有文件。我希望能够分析的位置

期望的输出:

"/Steve/SomePath": 1,
"/Steve/SomeOther": 2,
"/Steve": 2 /*Nice to have, omitting this one would be fine*/

所以,我正在尝试使用正则表达式方面来挑选我想要面对的源代码。我知道这不是最有效的方式,我们在使用自定义标记器的管道中有另一个想法,但如果我现在可以获得一个简单的工作版本,我们可以稍后改进它。

{
  "query": {
    "wildcard": "/Steve/*"
  },
  "facets": {
    "tag": {
      "terms": {
        "field": "OriginalURI",
        "regex": "^\\/Steve\\/.*?\\/.*$",
        "regex_flags": "DOTALL|UNICODE_CASE"
      }
    }
  }
}

希望这将在/Steve/之后的所有内容上面临(假设我可以指出要使用哪个匹配组)。实际上,它似乎只适用于过滤器 - 如果完整源包含在构面中或不是 - 所以我只是得到每个唯一来源的计数为1

我是否走正确的道路?如果没有,那么正确/简单的方法是什么?

1 个答案:

答案 0 :(得分:4)

您可以使用术语脚本提取您想要面对的部分:

curl -XGET 'localhost:9200/test/_search?pretty=true' -d '{
  "query": {
    "wildcard": {"OriginalURI": "/Steve/*"}
  },
  "facets": {
    "tag": {
      "terms": {
        "field": "OriginalURI",
        "script": "term.replaceAll(\"(\\\\/[^\\\\/]+)$\", \"\")"
      }
    }
  }
}'