gpt4 book ai didi

regex - ElasticSearch 和正则表达式查询

转载 作者:太空宇宙 更新时间:2023-11-04 14:14:27 26 4
gpt4 key购买 nike

我正在尝试查询“内容”字段正文中包含日期的文档。

curl -XGET 'http://localhost:9200/index/_search' -d '{
"query": {
"regexp": {
"content": "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"
}
}
}'

也许更接近?

curl -XGET 'http://localhost:9200/index/_search' -d '{
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"regexp":{
"content" : "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"
}
}
}
}'

我的正则表达式似乎已关闭。该正则表达式已在 regex101.com 上进行了验证 以下查询仍然没有从我拥有的 175k 文档中返回任何内容。

curl -XPOST 'http://localhost:9200/index/_search?pretty=true' -d '{
"query": {
"regexp":{
"content" : "/[0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{2}-[0-9]{2}-[0-9]{4}|[0-9]{2}/[0-9]{2}/[0-9]{4}|[0-9]{4}/[0-9]{2}/[0-9]{2}/g"
}
}
}'

我开始认为我的索引可能没有为这样的查询设置。您必须使用什么类型的字段才能使用正则表达式?

mappings: {
doc: {
properties: {
content: {
type: string
}title: {
type: string
}host: {
type: string
}cache: {
type: string
}segment: {
type: string
}query: {
properties: {
match_all: {
type: object
}
}
}digest: {
type: string
}boost: {
type: string
}tstamp: {
format: dateOptionalTimetype: date
}url: {
type: string
}fields: {
type: string
}anchor: {
type: string
}
}
}

我想查找任何有日期的记录,并绘制该日期之前的文档量图表。第 1 步是让这个查询工作。第 2 步将拉出日期并按日期进行相应分组。有人可以建议一种方法来让第一部分工作,因为我知道第二部分会非常棘手。

谢谢!

最佳答案

您应该阅读 Elasticsearch 的 Regexp Query documentation小心,您对正则表达式查询的工作原理做出了一些错误的假设。

这里要理解的最重要的事情可能是您要匹配的字符串是什么。您正在尝试匹配术语,而不是整个字符串。如果这是用 StandardAnalyzer 索引的,正如我所怀疑的,您的日期将被分成多个术语:

  • “01/01/1901”变为标记“01”、“01”和“1901”
  • “01 01 1901”变为标记“01”、“01”和“1901”
  • “01-01-1901”变为标记“01”、“01”和“1901”
  • “01.01.1901”实际上是一个 token :“01.01.1901”(由于十进制处理,请参阅 UAX #29 )

您只能将单个完整标记与正则表达式查询相匹配。

Elasticsearch(和 lucene)不支持完整的 Perl 兼容正则表达式语法。

在前几个示例中,您使用了 anchor ^$。这些不受支持。您的正则表达式必须匹配整个标记才能获得匹配项,因此不需要 anchor 。

也不支持像\d(或\\d)这样的简写字符类。使用 [0-9]{2},而不是 \\d\\d

在上次尝试中,您使用的是 /{regex}/g,这也是不受支持的。由于您的正则表达式需要匹配整个字符串,因此全局标志在上下文中甚至没有意义。除非您使用的查询解析器使用它们来表示正则表达式,否则您的正则表达式不应包含在斜杠中。

(顺便说一句:这个是如何在 regex101 上验证的?你有一堆未转义的 /。当我尝试它时,它向我提示。)

<小时/>

为了支持对此类分析字段进行此类查询,您可能需要考虑跨度查询,特别是 Span MultitermSpan Near 。也许是这样的:

{
"span_near" : {
"clauses" : [
{ "span_multi" : {
"match": {
"regexp": {"content": "0[1-9]|[12][0-9]|3[01]"}
}
}},
{ "span_multi" : {
"match": {
"regexp": {"content": "0[1-9]|1[012]"}
}
}},
{ "span_multi" : {
"match": {
"regexp": {"content": "(19|20)[0-9]{2}"}
}
}}
],
"slop" : 0,
"in_order" : true
}
}

关于regex - ElasticSearch 和正则表达式查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27922057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com