我正在使用ServiceStack.Redis来实现一个演示项目。它包含两个POCO,即专辑及其歌曲。
以下是使用秒表实例测量的搜索结果:
Time elapsed searching 5804 items is 00:00:00.1243984 <-- Albums
Time elapsed searching 138731 items is 00:00:02.0592068 <-- Songs
正如您所看到的,搜索歌曲花费了太多时间。我在WPF应用程序中显示结果,其中也输入了搜索词。 redis的延迟是暂时的。
以下是用于搜索的代码:
IEnumerable<int> songsFromRedis =
songRedis.GetAll()
.Where(song => song.Title != null
&& song.Title.ToLowerInvariant().Contains(searchText))
.OrderBy(song => song.Title)
.Select(x => x.AlbumId);
如果我们不能加快速度,ElasticSearch会帮忙吗?
答案 0 :(得分:2)
问题在于您如何使用Redis,即songRedis.GetAll()
下载整个数据集,将所有实体反序列化为C#对象并在客户端上执行搜索。
您永远不应该在客户端上通过网络下载和查询整个数据集(即使用任何数据存储区),即使完整的服务器端表扫描查询也会执行得更好,因为只有过滤后的结果才会返回给客户端,不是整个数据集。理想情况下,应该避免完整的服务器端表扫描,并且应该通过索引进行任何查询。
Redis并不支持内置索引,但在需要时您可以使用SET to manually create indexes between entities in Redis。
答案 1 :(得分:1)
任何面向搜索的数据库都会有所帮助。即使是mysql全文搜索,这也是非常慢的,在这里会好很多。
Elasticsearch是一个不错的选择,Sphinx是另一个不错的选择。 ES具有简单的可扩展性和易用性,sphinx具有性能优势和其他大多数常见功能,但是需要学习和扩展。