Elasticsearch中如何搜索带空格的匹配模式数据?
Elasticsearch字段模式匹配:过滤含空格的无关结果
数据结构
POST index_name/_doc/1 { "created_date": "2023-02-09T13:21:41.632492", "created_by": "hats", "data": [ { "name": "west cost", "document_id": "1" }, { "name": "mist cost", "document_id": "2" }, { "name": "cost", "document_id": "3" } ] }
原查询
GET index_name/_search { "query_string": { "default_field": "data.name", "query": "*t cost" } }
问题
预期仅返回包含west cost、mist cost的条目,但实际结果包含了仅含cost的条目,需调整查询实现正确的字段模式匹配。
解决方案
方案1:修正query_string的逻辑关系
原查询里的空格默认被解析为OR逻辑,*t cost等价于*t OR cost,因此会命中所有含cost的条目。需将逻辑改为AND,强制同时满足两个条件:
GET index_name/_search { "query_string": { "default_field": "data.name", "query": "*t AND cost" } }
方案2:用bool查询组合条件(更直观)
通过bool查询的must子句,明确要求字段同时包含「以t结尾的词」和「cost」:
GET index_name/_search { "query": { "bool": { "must": [ {"wildcard": {"data.name": "*t"}}, {"match": {"data.name": "cost"}} ] } } }
方案3:短语匹配(需适配分词规则)
如果需要严格匹配「以t结尾的词 + cost」的连续短语,可使用双引号包裹查询内容(若字段是text类型,需确保分词器保留短语的位置关系;若要完全匹配字符串,建议使用data.name.keyword子字段查询):
GET index_name/_search { "query_string": { "default_field": "data.name", "query": "\"*t cost\"" } }
内容的提问来源于stack exchange,提问作者Harshin Ramesh
相关产品推荐
相关产品推荐

