当前位置:   article > 正文

RedisSearch 标签搜索 中文支持_redis search关键字标红

redis search关键字标红

背景

公司需要做一个推荐系统,最后确定下来做一个初版,基于内容的推荐算法,使用相似度算法(余弦相识度)算法,目前Redis扩展 RedisSearch支持了 FLAT 和 HNSW 两种方式。 HNSW 比较合适,但是因为目前我们使用 golang 语言,没有合适的框架帮助我们生产商品数据,以及时间等原因第一期暂时不适用。最终选择了 Tag 搜索来满足0到1的实现。

开始使用redis tag标签搜索

创建商品数据

FT.CREATE goods_3 ON HASH PREFIX 1 goods: SCHEMA taste TAG city TAG breed TAG goods_year NUMERIC SORTABLE price NUMERIC SORTABLE
  • 1

添加一个商品

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 
  • 1
  • 2
  • 3

搜索

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

  • 1
  • 2
  • 3
  • 4
  • 5

中文支持

官方文档说的不清不楚的,自己记录一下,下面的例子使用 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} ...]] ...

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

demo

# 创建 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:{玫瑰}'

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

官方文档 -中文

备注

  • FLAT

Brute-force查找
从整个向量库里面全量查找,计算复杂度与向量库大小成线性关系。

  • HNSW

HNSW(Hierarchical Navigable Small World)是ANN搜索领域基于图的算法,我们要做的是把D维空间中所有的向量构建成一张相互联通的图,并基于这张图搜索某个顶点的K个最近邻。

感兴趣的可以看看这篇文章 HNSW算法

参考文献

RedisSearch 官方文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/606631
推荐阅读
相关标签
  

闽ICP备14008679号