赞
踩
公司需要做一个推荐系统,最后确定下来做一个初版,基于内容的推荐算法,使用相似度算法(余弦相识度)算法,目前Redis扩展 RedisSearch支持了 FLAT 和 HNSW 两种方式。 HNSW 比较合适,但是因为目前我们使用 golang 语言,没有合适的框架帮助我们生产商品数据,以及时间等原因第一期暂时不适用。最终选择了 Tag 搜索来满足0到1的实现。
FT.CREATE goods_3 ON HASH PREFIX 1 goods: SCHEMA taste TAG city TAG breed TAG goods_year NUMERIC SORTABLE price NUMERIC SORTABLE
HSET goods:1 taste "good,ok,fast" city "beiJin,shangHai,chengDu" breed "A,B,C,D" goods_year 1988 price 123.00
HSET goods:2 taste "laji,ok" city "shangHai,chengDu" breed "B,C,D" goods_year 2000 price 100.50
HSET goods:3 taste "good" city "shangHai,chengDu" breed "B,C,D" goods_year 2020 price 98
FT.SEARCH goods_3 @tags:{ laji | chengDu } SORTBY price asc
FT.SEARCH goods_3 "@city:{chengDu} @taste:{ok|laji} @goods_year:[1900 2010] @price:[-inf, 200]" SCORER taste
官方文档说的不清不楚的,自己记录一下,下面的例子使用 JSON 结构。
可以看到 LANGUAGE
可以设置语言(具体那些可以看官网),LANGUAGE_FIELD
设置分词官方默认支持 Friso 。
FT.CREATE {index}
[ON {data_type}]
[PREFIX {count} {prefix} [{prefix} ...]
[FILTER {filter}]
[LANGUAGE {default_lang}]
[LANGUAGE_FIELD {lang_attribute}]
[SCORE {default_score}]
[SCORE_FIELD {score_attribute}]
[PAYLOAD_FIELD {payload_attribute}]
[MAXTEXTFIELDS] [TEMPORARY {seconds}] [NOOFFSETS] [NOHL] [NOFIELDS] [NOFREQS] [SKIPINITIALSCAN]
[STOPWORDS {num} {stopword} ...]
SCHEMA {identifier} [AS {attribute}]
[TEXT [NOSTEM] [WEIGHT {weight}] [PHONETIC {matcher}] | NUMERIC | GEO | TAG [SEPARATOR {sep}] [CASESENSITIVE] [SORTABLE [UNF]] [NOINDEX]] |
[VECTOR {algorithm} {count} [{attribute_name} {attribute_value} ...]] ...
# 创建 JSON 索引
FT.CREATE json_goods1 ON JSON PREFIX 1 "test_goods:" LANGUAGE chinese SCHEMA $.brandName AS brandName TAG
# 创建 JSON 数据
JSON.SET test_goods:3 $ '{"brandName":"阳光玫瑰"}'
JSON.SET test_goods:4 $ '{"brandName":["阳光玫瑰","玫瑰"]}'
# 搜索中文标签
FT.SEARCH json_goods1 '@brandName:{玫瑰}'
Brute-force查找
从整个向量库里面全量查找,计算复杂度与向量库大小成线性关系。
HNSW(Hierarchical Navigable Small World)是ANN搜索领域基于图的算法,我们要做的是把D维空间中所有的向量构建成一张相互联通的图,并基于这张图搜索某个顶点的K个最近邻。
感兴趣的可以看看这篇文章 HNSW算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。