运营刚建了个新品,前台搜索框里怎么都搜不出来,跑来说搜索坏了。先别急着当 bug,把搜索走的这条路捋清楚,八成能自己排掉。
先说清楚它是怎么查的,省得瞎猜。前台搜索接口在 php/app/api/controller/search/Search.php,实际干活的是 php/app/service/admin/product/ProductSearchService.php。它就是拼数据库查询,开源版没有内置 Elasticsearch,就是走 MySQL 查 。关键词是拿去做 LIKE 匹配的,命中的字段有三个,在 ProductService 里能看到:
php
$query->where('product_name', 'like', '%' . $filter['keyword'] . '%')
->whereOr('keywords', 'like', '%' . $filter['keyword'] . '%')
->whereOr('product_sn', 'like', '%' . $filter['keyword'] . '%');
也就是商品名、keywords(分词关键词)、商品货号,任意一个包含你搜的词就能出。搞清这点,下面就好查了。
商品是不是真上架了
搜索接口拉列表时带的是 product_status => 1,只有上架的商品才会出。所以第一件事是去 product 表查这条记录的 product_status,顺带看 check_status 审核状态。没上架或者没过审的商品,前台本来就不该被搜到,这是最常见的一条,先排掉它再说别的。
搜的词命不命中那几个字段
前面说了匹配的是商品名、keywords、货号。你搜的词得真的落在这几个里。拿商品名里明确有的词试一下,能搜到就说明查询没毛病,是关键词的事,不是搜索坏了。
keywords 字段有没有写进去
keywords 是分词关键词,正常是商品保存时由 ParticipleService::cutForSearch() 根据商品名自动切出来写进去的。如果这条商品的 keywords 是空的(比如老数据、或者导入时没走正常保存流程),那用商品名里的词还能命中 product_name,但靠分词联想的词就搜不出来了。去表里看一眼这个字段是不是空的。
缓存有没有压着旧结果
搜索结果有时也走缓存。前面几项都对还是搜不到,清一次缓存再搜,排掉是缓存的可能。
商品量真上来了再考虑 ES
如果客户量级起来了、LIKE 查着明显慢,二开接 Elasticsearch 是常规做法,钩子挂在商品保存之后、保存即同步索引就行。但单商户体量下,商品没到几万几十万那个级别,标品这套 DB 搜索够用,先别急着上 ES 给自己加一摊运维。真到了要上的那天,先压测确认瓶颈在搜索,再动手。