我将日期字段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
更好?
1条答案
按热度按时间sf6xfgos1#
根据这个官方文档,
/
确实是一个保留字符。当使用JSON作为请求主体时,需要两个前置反斜杠(\),因为反斜杠是JSON字符串中的保留转义字符。regexp
查询对文本和关键字字段的工作方式不同。Elasticsearch在应用regex之前分析字段。Text fields are tokenized into individual words所以使用/
无法找到任何匹配。相反,整个关键字字段字符串被视为单个未分析的字符串(请参见Keyword analyzer)。在我使用关键字字段之后,使用
/
和regexp进行搜索:dob = fields.TextField(fields={"raw": fields.KeywordField()})