简单介绍了RedisJson。这篇开始讨论RedisSearch。

RedisSearch官网是:RediSearch - Redis Secondary Index & Query Engine

1. 简介

RedisJson提供了存储Json格式数据的利器,而RedisSearch则让我们可以愉快的进行Json的搜索。官方介绍为:

RediSearch is a source available Secondary Index, Query Engine and Full-Text Search over Redis, developed by  Redis

RedisSearch不像其他的redis类型,有其内部的存储结构,而是用了不一样的结构。具体是什么结构,如何索引,官网并没有透露。

RedisSearch官网描述了主要的一些特性,包括二级索引,全文查找,地理信息过滤等,可以在官网的home下,查看详细信息。

RedisSearch的docker 安装也非常方便。

docker pull redislabs/redisearch

然后运行docker run就可以了。

docker run -d -p 6379:6379 --name redis-search redislabs/redisearch:latest

可以通过module list查看当前的module:

127.0.0.1:6379> MODULE LIST
 1) 1) "name"
    2) "ReJSON"
    3) "ver"
    4) (integer) 20004
 2) 1) "name"
    2) "search"
    3) "ver"
    4) (integer) 20205

2. 基本使用

RedisSearch的所有命令可以在官网command Reference下查看:Command Reference - RediSearch - Redis Secondary Index & Query Engine

2.1 创建索引

命令:

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]] ...

需要注意的是,RedisSearch的命令都是以FT开头。看下创建索引的参数。

{index}:索引的名字,必须要有

on {data_type}:数据类型,指的是要在哪种数据类型上创建索引,目前支持hash和json,默认为hash。如果要索引json类型,就必须要有RedisJson了。

PREFIX {count} {prefix} [{prefix} ..:指的是要在哪些key上做索引。通过key的前缀进行指定,并且可以指定多个,如果不指定的话,默认是*,即索引所有的key。

FILTER {filter}:过滤器。官网说这个是一个RedisSearch聚合表达式,可以使用@__key来访问刚刚添加/更改的key,并通过'FILTER @indexName=="myindexname"来设置字段名。这个我觉得我们项目上没用,所以没有做具体实例。

LANGUAGE: 创建索引的语言。如果是中文,就要用中文分词器来分词索引。默认是friso。

LANGUAGE_FIELD :指明哪个field用指定的语言。

SCHEMA :指定要索引哪些字段。 ,

        {identifier}:对于hash类型的索引指的是字段名,对于json类型的索引,指的是jsonpath。

        {attribute}:相当于给identifier起一个别名

        Filed Type:字段应用的类型,有四种:

                TEXT:文本类型

                TAG:tag是一种特殊的类型,和文本类型相比,它更简短,但是并不支持全文检索

                NUMERIC:数字类型,可以做范围查询

                GEO:地理位置索引

针对每种filed type,有一些选项可以选,比如SORTABLE ,WEIGHT,PHONETIC 等,具体含义可以查看官网。

2.2 查找数据

命令:

FT.SEARCH {index} {query} [NOCONTENT] [VERBATIM] [NOSTOPWORDS] [WITHSCORES] [WITHPAYLOADS] [WITHSORTKEYS]
   [FILTER {numeric_attribute} {min} {max}] ...
   [GEOFILTER {geo_attribute} {lon} {lat} {radius} m|km|mi|ft]
   [INKEYS {num} {key} ... ]
   [INFIELDS {num} {attribute} ... ]
   [RETURN {num} {identifier} [AS {property}] ... ]
   [SUMMARIZE [FIELDS {num} {attribute} ... ] [FRAGS {num}] [LEN {fragsize}] [SEPARATOR {separator}]]
   [HIGHLIGHT [FIELDS {num} {attribute} ... ] [TAGS {open} {close}]]
   [SLOP {slop}] [INORDER]
   [LANGUAGE {language}]
   [EXPANDER {expander}]
   [SCORER {scorer}] [EXPLAINSCORE]
   [PAYLOAD {payload}]
   [SORTBY {attribute} [ASC|DESC]]
   [LIMIT offset num]

也是捡几个我用的参数说下意思:

{index}:指定要用哪个索引进行查找

{query}:查询语句

GEOFILTER {geo_attribute} {lon} {lat} {radius} m|km|mi|ft:根据地理信息进行过滤。需要指定经度{lon}和纬度{lat},并指定范围大小{redius}和单位{m|km|mi|ft}。如[122.413 37.767 5 km],意思是查询点[122.413 37.767]周围5km区域。

LANGUAGE :使用什么语言

2.3 其他命令

还有很多其他命令,我用的比较多的有:

ft.info: 查看索引信息

ft._list: 查看有哪些索引

ft.drop: 删除索引

ft.config: 查看配置,这个在配置friso的时候会用到