Elasticsearch-PHP:使用‘dhi’查询name字段无结果的解决方法
解决Elasticsearch-PHP中前缀关键词搜索无结果的问题
嘿,我来帮你搞定这个搜索无结果的问题!
问题原因
你当前用的match查询之所以返回0条结果,是因为你的name字段大概率是默认的text类型——Elasticsearch会把dhiraj chetry这样的文本分词拆成dhiraj和chetry两个独立词条。而match查询是匹配完整的分词词条,dhi只是dhiraj的前缀,自然匹配不到任何结果。
解决方案
根据你的需求,这里有几种可行的实现方式:
1. 使用match_phrase_prefix查询(最适合你的场景)
这个查询可以匹配字段中以指定前缀开头的短语片段,完美适配你用dhi搜索dhiraj chetry的需求:
$indexParams = [ 'index' => 'my company', 'type' => 'interns', // 注意:Elasticsearch 7+已废弃type,高版本可移除该参数或设为'_doc' 'body' => [ 'query' => [ 'match_phrase_prefix' => [ 'name' => 'dhi' ] ] ] ];
2. 使用wildcard通配符查询
通过通配符*匹配任意后缀,也能实现前缀搜索:
$indexParams = [ 'index' => 'my company', 'type' => 'interns', 'body' => [ 'query' => [ 'wildcard' => [ 'name' => 'dhi*' ] ] ] ];
⚠️ 注意:wildcard查询性能相对较低,不建议在高频查询场景中大量使用。
3. 给字段添加keyword子字段(适合高频前缀搜索场景)
如果你的前缀查询需求比较频繁,建议先给name字段添加一个keyword类型的子字段(这样既保留全文搜索能力,又能高效做前缀匹配):
首先更新索引的mapping(如果还没设置):
{ "mappings": { "properties": { // ES7+无需外层type层级 "name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } } }
然后使用prefix查询这个子字段:
$indexParams = [ 'index' => 'my company', 'type' => 'interns', 'body' => [ 'query' => [ 'prefix' => [ 'name.keyword' => 'dhi' ] ] ] ];
额外提示
如果你使用的是Elasticsearch 7.x及以上版本,type参数已经被官方废弃,建议直接移除'type' => 'interns'这一行,或者将其设置为'_doc'(兼容旧版本的写法)。
内容的提问来源于stack exchange,提问作者kishan
相关产品推荐
相关产品推荐

