ElasticSearch正则查询无法匹配子字符串问题求助
ElasticSearch子字符串匹配失败问题解决
问题根源
不是正则表达式的问题,核心原因是你的content字段使用了portuguese分析器,索引阶段会对文本做词干提取处理:比如原文本中的encaminho会被转化为词根形式(如caminh),而非保留完整字符串。当你用regexp查询content:.*caminho.*时,ES是在分词后的词条集合(而非原始文本)中匹配正则,自然找不到对应结果——分词后的词条里没有包含caminho的字符串。
解决方法
方法1:使用默认的keyword子字段查询
ES会为text类型字段自动生成一个字段名.keyword的子字段,该字段以keyword类型存储原始未分词的文本,直接查询这个字段即可匹配原始字符串的子串:
GET exemplo/_search { "from": 0, "size": 1, "query": { "bool": { "must": [ {"regexp": {"content.keyword": ".*caminho.*"}} ] } } }
方法2:显式定义keyword子字段(推荐)
如果需要长期做这类原始文本匹配,建议显式在mapping中添加自定义的keyword子字段,提升可读性和灵活性:
PUT exemplo/_mapping { "properties": { "content": { "type": "text", "analyzer": "portuguese_br", "fields": { "raw": { "type": "keyword" } } } } }
之后查询content.raw字段即可实现子串匹配。
方法3:基于词干的前缀匹配
如果无需严格匹配原始子串,只是想找到包含caminho词根的词汇,可以使用match_phrase_prefix查询,利用分析器的词干处理能力:
GET exemplo/_search { "from": 0, "size": 1, "query": { "match_phrase_prefix": { "content": "caminho" } } }
内容的提问来源于stack exchange,提问作者DiChrist
相关产品推荐
相关产品推荐

