简单介绍了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的时候会用到