Laravel+Elasticsearch实现ITEMS表双字段模糊搜索
Elasticsearch 双字段模糊匹配实现方法
你现有单字段查询的逻辑只需要微调即可实现双字段任意匹配的需求,不需要更换查询类型。
基础可用写法
直接将需要检索的name字段加入query_string的fields配置数组,显式指定逻辑为OR即可和原有Laravel的orWhere逻辑完全对齐:
'body' => [ 'query' => [ 'query_string' => [ "query" => "*".$query."*", "fields" => ['search_name', 'name'], "default_operator" => "OR" ] ], ]
这个写法会同时在两个字段中做包含关键词的模糊匹配,输入关键词t时,你给出的两条示例数据:
- 第一条
search_name为TR61QF包含字符T(ES默认文本分析器会做小写转换,不区分大小写匹配) - 第二条
name字段包含TIGER关键词,同样命中
两条记录都会正常返回。
适配keyword类型字段的补充配置
如果你的search_name、name字段映射为keyword类型(没有经过分词器处理),默认是大小写敏感的,需要额外增加case_insensitive参数开启大小写不敏感匹配,避免输入小写t匹配不到大写T的问题:
'body' => [ 'query' => [ 'query_string' => [ "query" => "*".$query."*", "fields" => ['search_name', 'name'], "default_operator" => "OR", "case_insensitive" => true ] ], ]
性能提示
左右通配符(*关键词*)的查询方式在数据量超过百万级时性能会明显下降,如果后续数据量增长,可以考虑给两个字段配置ngram分词器,替换通配符查询为普通match查询,能大幅提升检索速度。
内容的提问来源于stack exchange,提问作者Jinal Somaiya
相关产品推荐
相关产品推荐

