Elasticsearch regexp匹配部分文本格式的日期

vltsax25  于 2023-06-05  发布在  ElasticSearch
关注(0)|答案(1)|浏览(244)

我将日期字段dob化为文本dob.strftime("%m/%d/%Y"),并将这些日期存储在Elasticsearch 8.7.1("lucene_version": "9.5.0")上,以便我可以利用regexp进行部分日期匹配。
假设这个日期存储在Elasticsearch上:06/01/2023,我注意到我只能在使用这些regexp查询时得到这个结果:

  • 06.*
  • .*01.*
  • .*2023

但是,在查询中使用/\/\\/无法返回任何结果。对Elasticsearch's doc进行了双重检查,/不是保留字符。
我有几个问题,帮助将不胜感激:
1.为什么/不能作为regexp查询的一部分?
1.如何正确表达regexp查询?我希望在键入与以下任何格式匹配的术语后可以找到匹配项:

- M/d
- M/d/YY
- M/d/YYYY
- M/dd
- M/dd/YY
- M/dd/YYYY
- M/YY
- M/YYYY
- MM/d
- MM/d/YY
- MM/d/YYYY
- MM/dd
- MM/dd/YY
- MM/dd/YYYY
- MM/YY
- MM/YYYY

1.是否有其他类型的搜索比regexp更好?

sf6xfgos

sf6xfgos1#

根据这个官方文档,/确实是一个保留字符。当使用JSON作为请求主体时,需要两个前置反斜杠(\),因为反斜杠是JSON字符串中的保留转义字符。
regexp查询对文本和关键字字段的工作方式不同。Elasticsearch在应用regex之前分析字段。Text fields are tokenized into individual words所以使用/无法找到任何匹配。
相反,整个关键字字段字符串被视为单个未分析的字符串(请参见Keyword analyzer)。在我使用关键字字段之后,使用/和regexp进行搜索:

  • dob = fields.TextField(fields={"raw": fields.KeywordField()})
"mappings": {
  "properties": {
    "dob": {
      "type": "text",
      "fields": {
        "raw": {
          "type": "keyword"
        }
      }
    }
 }
{
  "query": {
    "regexp": {
      "dob.raw": ".*6\\/.*2023.*"
    }
  }
}

相关问题