0

我正在使用 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 会有帮助吗?

4

2 回答 2

2

问题在于您如何使用 Redis,即songRedis.GetAll()下载整个数据集、将所有实体反序列化为 C# 对象并在客户端上执行搜索。

您永远不应该在客户端(即使用任何数据存储)上通过网络下载和查询整个数据集,即使是完整的服务器端表扫描查询也会执行得更好,因为只有过滤后的结果会返回给客户端,而不是整个数据集。理想情况下,甚至应该避免完整的服务器端表扫描,并且应该通过索引进行任何查询。

Redis 不支持内置索引,但在需要时,您可以使用 SET在 Redis 中的实体之间手动创建索引

于 2014-11-20T05:11:09.773 回答
1

任何面向搜索的数据库都会有所帮助。即使是众所周知的慢的mysql全文搜索,在这里也会好很多。

Elasticsearch 是一个不错的选择,Sphinx 是另一个不错的选择。ES 具有简单的可扩展性和易用性,sphinx 具有性能优势和其他大多数常见功能,但需要更多的学习和扩展工作。

于 2014-11-19T21:11:36.870 回答