OpenSearch如何对整个字段执行正则表达式搜索?
OpenSearch正则匹配整个字段的解决方案
OpenSearch的regexp查询默认仅对字段的**单个分词(token)**应用正则规则,而非整个字段的原始内容。比如执行以下查询:
{ "query": { "regexp": { "myfield": ".+ABC.+" } } }
当目标字段myfield中的"ABC"前后存在空格(字段会被分词器拆分为多个独立token)时,该查询无法返回结果。例如字段内容为:The fields FIELD1 and FIELD2 are different: ABC4345 vs 2405987390
若要匹配.+are different.+ABC.+vs.+或.+ABC.+这类覆盖整个字段的正则,可通过以下方式处理:
方法1:使用字段的keyword子字段
如果你的字段在映射中定义了keyword类型的子字段(多数情况下默认会生成,格式为字段名.keyword),直接针对该子字段执行regexp查询即可。keyword类型会保留字段的原始完整字符串,不做分词处理:
{ "query": { "regexp": { "myfield.keyword": ".+ABC.+" } } }
针对更复杂的正则需求,比如匹配.+are different.+ABC.+vs.+,同样替换为keyword子字段:
{ "query": { "regexp": { "myfield.keyword": ".+are different.+ABC.+vs.+" } } }
方法2:替代方案(无keyword子字段时)
如果无法使用keyword子字段(比如未定义映射且无法修改),可以尝试以下方式,但性能和准确性不如方法1:
- 使用
query_string查询结合通配符模拟:
{ "query": { "query_string": { "default_field": "myfield", "query": "*are different*ABC*vs*", "phrase_slop": 0 } } }
注意:通配符开头的查询性能较差,数据量较大时不推荐使用。
内容的提问来源于stack exchange,提问作者geco17
相关产品推荐
相关产品推荐

