regex - 正则表达式结果的方面

标签 regex elasticsearch facet

我有一个弹性索引,其中包含包含“源”字段的文档。

{"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 .

我走在正确的道路上吗?如果不是,那么正确/简单的方法是什么?

最佳答案

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

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

关于regex - 正则表达式结果的方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17403328/

相关文章:

php正则表达式匹配html标签之外

javascript - 如何删除字符串中最后一个逗号字符后的所有内容?

apache-spark - Spark 2.4到Elasticsearch:防止dataproc节点退役期间的数据丢失?

elasticsearch - 试图恢复与死 ES 实例的连接,但出现错误

elasticsearch - 匹配查询不返回结果

r - ggplot2和一行中的第一个数据点

r - 调整 facet_grid 中 One Line 的线型

regex - Grep中有真正通用的通配符吗? [复制]

regex - 如何使用Regex搜索不以另一个字符串开头的字符串

c++ - 即使使用适当的方面,非有限 float 的反序列化也会失败