雷迪斯 有一 套多功能的数据结构 ,从简单的 字符串 一路到强大的抽象,如 雷迪斯流。本机数据类型可能需要很长的路要走,但有些使用案例可能需要解决方法。一个例子是需要使用 Redis 中的二级索引,以便超越基于密钥的搜索/查找以获得更丰富的查询功能。虽然您可以 使用排序集、列表等来完成工作,但您需要考虑一些权衡。

进入 雷迪搜索!RediSearch 作为 Redis 模块提供灵活的搜索功能,这要归功于一流的二级索引引擎。它提供了强大的功能,如全文搜索,自动完成,地理索引,等等。

为了证明 RediSearch 的力量,本文提供了一个实际的例子,说明如何使用 RediSearch 与Azure 缓存为雷迪斯与使用RediSearch Go 客户端构建的Go服务。它旨在为您提供一组应用程序,让您实时摄入推文,并使用 RediSearch 灵活查询它们。

具体来说,您将学习如何:

  • 与雷迪搜索索引配合

  • 使用不同的 RediSearch 数据类型, TEXT 例如 NUMERIC TAG ,”和其他

  • 如何构建应用程序以显示 Redi 搜索功能

  • 如何仅通过几个命令将服务组件部署到 Azure

  • 通过查询 Redi 搜索分析推文数据

应用概述

如前所述,示例服务允许您实时消费推文,并可通过 RediSearch 进行查询。

它有两个组件:

  1. 消费者/指数: 从 Twitter 流 Api 阅读, 创建索引, 并在推文数据到达时不断添加推文数据 (在 Redis HASH es 中) 。

  2. 搜索服务: 一个 REST API,允许您使用 RediSearch 查询语法搜索推文。

在这一点上,我将深入探讨如何启动和运行解决方案,以便您可以在操作中看到它。但是,如果您有兴趣了解各个组件的工作原理,请参阅下面的代码演练部分,以及此博客的 GitHub 回购:https://github.com/abhirockzz/redisearch-tweet-analysis。

先决条件

  1. 首先,您将需要一个微软Azure帐户:在这里 免费获得一个

  2. 上面列出的服务组件将使用原生 Docker CLI 命令部署到 Azure 容器实例 。这种能力是由 多克和阿祖雷之间的集成启用的。

  3. 您将需要多克桌面版本2.3.0.5或更高版本,用于Windows、macOS,为Linux安装多克ACI集成CL。 要使用推特流API,您还需要一个推特开发人员帐户。如果你还没有,请按照这些指示

首先使用此快速启动教程在 Azure 上 设置 Redis 企业级缓存 。完成设置后,请确保您拥有 Redis 主机名并方便访问密钥:

我们服务的两个组件都作为 Docker 容器提供: 推文索引服务搜索 API 服务。(如果您需要构建自己的 Docker 图像,请使用 GitHub 回购上可用的各自的 Docker 文件。

现在,您将看到将这些部署到 Azure 容器实例是多么方便,它允许您在托管、无服务器 Azure 环境中按需运行 Docker 容器。

部署到蔚蓝

Yaml

20
版本:”2″

2
服务
3
  推文搜索
4
  图像 :  阿布希罗茨/重新搜索-推文-搜索
5
  端口
6
  80:80
7
  环境
8
  REDIS_HOST=蔚蓝重新命名主机名称|
9
 - REDISEARCH_INDEX_NAME+推文索引

11
  推文索引器
12
  图像 :  abhirockz / 重新搜索 - 推文 - 消费者
13
  环境
14
  TWITTER_CONSUMER_KEY=推特api消费钥匙|
15
  TWITTER_CONSUMER_SECRET_KEY
16
  TWITTER_ACCESS_TOKEN:推特阿皮访问令牌|
17
  TWITTER_ACCESS_SECRET_TOKEN
18
 - REDIS_PASSWORD=azure 重新分配访问密钥|

20
  REDISEARCH_INDEX_NAME+推文索引

Docker-撰写.yml 文件定义了单个组件(推文搜索和推文索引器)。所有你需要做的是更新它,以取代您的Azure Redis实例的值,以及您的Twitter开发人员帐户凭据。下面是整个文件:

创建蔚蓝背景

x
1
多克登录蔚蓝

2
docker context create aci aci-context 
3
码头工人上下文使用 aci 上下文

克隆吉图布回购:

x
1
1

2
cd 重新搜索-推文分析

将两个服务组件作为 容器组的一部分部署:

x
1
1
Azure 门户。一旦两个服务都启动并运行,您可以检查各自的日志:

x
1
1
docker logs azure-redisearch-app_tweets-indexer 
2
真理的时刻!

是时候查询推文数据了。为此,您可以使用 IP 地址和完全合格的域名 (FQDN) 访问 Azure 容器实例中的 REST API(在 容器访问中阅读更多内容)。要查找 IP,请运行 docker ps 并检查 PORTS 输出中的部分

您现在可以运行各种查询!在潜入之前,您可以快速了解搜索查询中可以使用的索引属性:

id - this is a the Tweet ID ( TEXT attribute) 
user - the is the screen name ( TEXT attribute) 
text - tweet contents ( TEXT attribute) 
source - tweet source e.g. Twitter for Android, Twitter Web App, Twitter for iPhone ( TEXT attribute) 
hashtags - hashtags (if any) in the tweet (available in CSV format as a TAG attribute) 
location - tweet location (if available). this is a user defined location (not the exact location per se) 
created - timestamp (epoch) of the tweet. this is NUMERIC field and can be used for range queries 
coordinates - geographic location (longitude, latitude) if made available by the client ( GEO attribute)

(注意,我在下面的例子中使用 卷曲

为搜索服务API设置基本网址:

x
1
出口REDISEARCH_API_BASE_URL=+例如,http://20.197.96.54:80/search>:

开始简单并查询所有文档(使用 * ):

x
1
1
卷曲-i$REDISEARCH_阿皮_基地_网址=*

您将看到类似这样的输出:

HTTP/1

为了回应我们的"获取所有文档"查询,我们在 Redis 中发现了 12 个结果,但 JSON 机构返回了 10 个条目。这是因为 RediSearch Go API 的默认行为,您可以使用不同的查询参数更改该行为,例如:

x
1
1
卷曲-i"$REDISEARCH_API_BASE_URL?q===offset_limit=0,100" 
2

3


或者,例如,搜索从 iPhone 发送的推文:

x
1
1
卷曲-i"$REDISEARCH_API_BASE_URL?q=@source:iphone" 

您可能并不总是想要查询结果中的所有属性4便士:">

1
卷曲- i"$REDISEARCH_API_BASE_URL?q=@location:印度和字段=用户,文本" 

如何查询用户名(例如从jo开始):

x
1
1
          

1
巴什卷曲-i$REDISEARCH_API_BASE_URL_q=@location:印度@source:机器人

我们如何查找带有特定井号标签的推文?是否可以使用多个井号标签(由|隔开)?

x
1
1
卷曲 -i "$REDISEARCH_API_BASE_URL? q=@hashtags:[比登] @created:[161155692000000000 171556930000000000]"

如果您幸运地在推文上获取了一些坐标信息,您可以尝试提取它们,然后查询坐标属性:

x
1
1
-p 蔚蓝-重新搜索-应用程序

这些只是几个例子Redi搜索文档中的此部分可能会派上用场!

清理

完成后,不要忘记停止Azure容器实例中的服务和相应的容器:

使用 Azure 门户 删除您创建的 Azure 雷迪斯实例

代码演练

本节提供了单个组件的代码高级概述。这应该可以更轻松地在 GitHub 回购中导航源代码。

推文消费者/索引器:

去推特图书馆 已经被用来与推特互动。

它验证到推特流 Api:

config := oauth1.NewConfig(GetEnvOrFail(consumerKeyEnvVar), GetEnvOrFail(consumerSecretKeyEnvVar)) 
token := oauth1.NewToken(GetEnvOrFail(accessTokenEnvVar), GetEnvOrFail(accessSecretEnvVar)) 
httpClient := config.Client(oauth1.NoContext, token) 
client := twitter.NewClient(httpClient)

并在单独的路线中收听推文流:

demux := twitter.NewSwitchDemux() 
demux.Tweet = func(tweet *twitter.Tweet) { 
  if !tweet.PossiblySensitive { 
    go index.AddData(tweetToMap(tweet)) 
    time.Sleep(3 * time.Second) 
  } 
} 
go func() { 
  for tweet := range stream.Messages { 
    demux.Handle(tweet) 
  } 
}()

请注意去索引。添加数据(推文图图(推文)-这是索引组件被调用的位置。它连接到雷迪斯的蔚蓝缓存:

host := GetEnvOrFail(redisHost) 
password := GetEnvOrFail(redisPassword) 
indexName = GetEnvOrFail(indexNameEnvVar) 

pool = &redis.Pool{Dial: func() (redis.Conn, error) { 
  return redis.Dial("tcp", host, redis.DialPassword(password), redis.DialUseTLS(true), redis.DialTLSConfig(&tls.Config{MinVersion: tls}
  }

然后,在重新创建索引之前,它会降低索引(以及现有文档):

rsClient := redisearch.NewClientFromPool(pool, indexName) 

err := rsClient.DropIndex(true) 

schema := redisearch.NewSchema(redisearch.DefaultOptions). 
AddField(redisearch.NewTextFieldOptions("id", redisearch.TextFieldOptions{}))

新特菲尔德选项("用户",重新搜索。文本字域选项[})。
添加场(重新搜索。新文本字域选项("文本",重新搜索。文本字域选项[})。
添加场(重新搜索。新特菲尔德选项("来源",重新搜索。文本字域选项[})。
默认情况下,标记是逗号分离的
添加场(重新搜索。新塔格菲尔德选项 ("哈希标记", 重新搜索。塔格菲尔德选项[})。
添加场(重新搜索。新特菲尔德选项("位置",重新搜索。文本字域选项[})。
添加场(重新搜索。新数字领域选项("创建",重新创建。数字场选项[可排序:真实})。
添加场(重新搜索。新Geo场选项("坐标",重新搜索。地理场选项[})

索引定义:=重新定义。新定义()。添加前缀(索引定义哈什预缀)

错误=rs克莱恩。用无限定义创建无限定义(模式,索引定义)

该索引及其相关文档被丢弃,以便您从干净的状态开始,从而更容易进行实验/演示。如果您愿意,您可以选择评论此部分。

使用操作将每个推文的信息存储在 HASH 一个(命名 tweet:[tweet ID]HSET 中:

func AddData(tweetData map[string]interface{}) { 
conn := pool.Get() 
hashName := fmt.Sprintf("tweet:%s", tweetData["id"]) 
val := redis.Args{hashName}.AddFlat(tweetData) 
_, err := conn.Do("HSET", val...) 
}

推文搜索暴露了一个RESE API来查询雷迪搜索。所有选项(包括查询等)均以查询参数的形式传递。例如,http://localhost:8080/search?q=@source:iphone。它提取所需的查询参数:

qParams, err := url.ParseQuery(req.URL.RawQuery) 
if err != nil { 
log.Println("invalid query params") 
http.Error(rw, err.Error(), http.StatusBadRequest) 
return 
} 
searchQuery := qParams.Get(queryParamQuery) 
query := redisearch.NewQuery(searchQuery)

q参数是强制性的。但是,您也可以使用以下参数进行搜索:

  • 字段 :指定要在结果中返回的属性,以及,

  • offset_limit: 如果您想要指定要搜索的偏移以及要在结果中包含的文档数量(默认情况下,偏移为 0,限制为 10 -根据 RediSearch Go 客户端)。

例如:

http://localhost:8080/search?q=@source:Web&fields=user,source&offset_limit=5,100 
fields := qParams.Get(queryParamFields) 
offsetAndLimit := qParams.Get(queryParamOffsetLimit)

最后,结果被重新重复,并作为 JSON(文档阵列)传回:

docs, total, err := rsClient.Search(query) 
response := []map[string]interface{}{} 
for _, doc := range docs { 
response = append(response, doc.Properties) 
} 
rw.Header().Add(responseHeaderSearchHits, strconv.Itoa(total)) 
err = json

编码(响应)

这一切都是为了这个部分!

为雷迪斯在 Azure 缓存上重新分配企业层

雷迪斯企业是作为 Azure 上的本地服务,形式为 Azure 缓存的两个新层, 由微软和雷迪斯实验室运营和支持。此服务使开发人员能够访问一组丰富的 Redis 企业功能,包括像 RediSearch 这样的模块。有关更多信息,请参阅以下资源:

结论

此端到端应用程序演示了如何使用索引,摄入实时数据以创建由 RediSearch 引擎编入索引的文档(推文信息),然后使用多功能查询语法提取有关这些推文的见解。

想要了解在Redis 实验室文档上搜索主题时,在幕后会发生什么情况?看看这个博客文章,了解如何雷迪斯实验室网站纳入全文搜索与RediSearch!或者,也许您有兴趣探索如何在无服务器应用程序中使用 RediSearch?

如果您仍在开始,请访问 Redi 搜索快速启动页面com/博客/重新搜索行动/"rel="无开放者无参考"目标="_blank">https://redislabs.com 2021年3月30日。

Comments are closed.