电商中怎么做类似模糊搜索的功能?

发布于 2021-11-30 09:38:08 字数 108 浏览 835 评论 17

         请问一下在电商中实现类似模糊搜索的功能,比如 搜"特斯邦威" 可以搜索出 美特使邦威相关商品?京东和苏宁都实现了类似问题?请大神指教,有什么好的策略

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(17

墨洒年华 2021-12-03 14:34:29

回复
分词怎么控制粒度,现在我们把名牌当做一个词,但是用户搜索只输入部分品牌名,现在想搜索出来结果,由于分词没有部分品牌的名字的词所以不能命中

霞映澄塘 2021-12-03 14:34:28

用搜索引擎的组件;java的话可以选择用elastic-search

千笙结 2021-12-03 14:34:27

用solr 服务,如果闲麻烦 可以用lucene 包  建立索引,检索

冷弦 2021-12-03 14:34:26

solr

冬天旳寂寞 2021-12-03 14:33:38

回复
@Minho : 分词怎么控制粒度,现在我们把名牌当做一个词,但是用户搜索只输入部分品牌名,现在想搜索出来结果,由于分词没有部分品牌的名字的词所以不能命中

心欲静而疯不止 2021-12-03 14:33:24

这属于搜索引擎相关知识了。

反话 2021-12-03 14:33:03

#ftserver# 无需分词,新品牌上线不需要重做词库,
只输入部分词也可以搜索

奈何桥上唱咆哮 2021-12-03 14:32:50

回复
@web4j : 分词怎么控制粒度,现在我们把名牌当做一个词,但是用户搜索只输入部分品牌名,现在想搜索出来结果,由于分词库没有部分品牌的名字的词所以不能命中

沦落红尘 2021-12-03 14:32:31

用的技术:分词+搜索引擎。

等你爱我 2021-12-03 14:23:28

回复
@Feng_Yu : 就是啊 ,分词怎么控制粒度,现在我们把名牌当做一个词,但是用户搜索只输入部分品牌名,现在想搜索出来结果,由于分词没有部分品牌的名字的词所以不能命中

小瓶盖 2021-12-03 14:17:30

这就是分词的功能啊

羁拥 2021-12-03 14:05:02

用solr吧。。。结合IK分词,查询速度很快的,不要直接查库

青萝楚歌 2021-12-03 13:54:59

回复
@eechen : 对,现在就是设计到怎么扩充词库,我们对一个品牌本来是应该切成一个词的,但是由于用户习惯他只输入部分词,现在想把这些只输入部分词query召回想要的结果,做到类似模糊搜索的功能,有没有什么好的策略来扩充词库

不乱于心 2021-12-03 13:44:06

回复
我上面提供的分词算法不依赖词典,只要原文出现有用户输入的词,都能匹配到.代价是分词字数约为原文字数的2倍.所以个人觉得用来匹配标题等简短的内容比较合适.

左岸枫 2021-12-03 13:27:30

不错

终遇你 2021-12-03 06:51:44

不错哦

多情癖 2021-12-01 11:52:07

比如插入一条数据时:

"美特斯邦威"会被分词为:

美特 特斯 斯邦 邦威

并存储到一个支持全文索引的字段里.

用户输入的"特斯邦威"会被分词为:

特斯 斯邦 邦威

然后使用全文检索:

MySQL:

SELECT docid, content FROM post_fts

WHERE MATCH(content) AGAINST('+特斯 +斯邦 +邦威' IN BOOLEAN MODE);

SQLite:

SELECT docid, content FROM post_fts

WHERE post_fts MATCH '特斯 斯邦 邦威';

分词表post_fts里的docid对应数据表post里的id.

不依赖词典的中文分词算法如下:

<?php
//不依赖词典的中文分词器
function cws($str) {
	//找出字符串中的英文单词和数字
	if(preg_match_all('%[A-Za-z0-9_-]{2,}%', $str, $matches)) {
		$arr = $matches[0];
	}
	//以非中文(中文包括简体和繁体)进行正则分割
	$sections = preg_split('%[^x{4e00}-x{9fa5}]{1,}%u', $str);
	foreach($sections as $v) {
		if(preg_match_all('%[x{4e00}-x{9fa5}]%u', $v, $matches)) {
			//前后俩俩组合,实现冗余分词:如"中国好声音"将被分词为: 中国 国好 好声 声音
			$size = count($matches[0]);
			for($i = 0; $i <= $size-2; $i++) {
				$word = '';
				for($j = 0; $j < 2; $j++) {
					$word .= $matches[0][$i+$j]; //echo $i.' '.$j.' '.$matches[0][$i+$j]."n";
				}
				$arr[] = $word; //echo "n";
			}
		}
	}
	return array_unique($arr);
}

原文字数为n,分词后的字数为2n-2,分词字数约为原文字数的2倍.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文