我们有关系数据库(SQL Server 2014,大约30个表,非常规范化)。该应用程序使用Web.API / AngularJS
构建我们需要实现动态搜索 - 用户可以从多个实体中选择几个字段;生成的搜索伪代码可能如下所示:
SearchConditions
(
{Company.Name} <Contains> "Enterprise"
)
AND
(
{Customer.State} <Equals> "MO"
OR
{Customer.State} <Equals> "TX"
)
AND
(
{Company.AnnualSales} <LessThan> "123456.00"
)
Return
Company.Name,Customer.Name
Group By State, Company
搜索的结构将保持不变 - 由&#34; AND&#34;连接的一系列条件;每个条件都可能有一些&#34; OR&#34;里面的物品。
我们正在使用实体框架;
到目前为止,我看到了实现此功能的几种方法:
1)构建SQL查询并针对db运行(非常繁琐)
2)创建EF IQueryable 对象并使用EF获取数据 更容易,但我担心结果SQL会很糟糕)
3)使用Lucene.NET (它需要Solr服务器,我想避免它 如果可能的话)
4)创建db的非规范化OLAP实例并使用方法(1)或(2)
我很确定必须有其他方法;毕竟,EF / .NET / SQL组合并不是那么罕见;如果我可以避免它,我不想重新发明轮子。理想的解决方案是解析搜索字符串,进行搜索并返回必填字段(分页也是一个很好的补充)
SSAS / SSRS会有帮助吗?
答案 0 :(得分:1)
虽然您提到的所有解决方案都可能有效,但我会推荐Elasticsearch。
Elasticsearch是一个构建在Lucene之上的文档存储(虽然您不需要运行单独的Solr服务器),并且非常易于运行和安装。还有一个很好的.Net API,名为Nest。顾名思义,它专门用于搜索。它还具有许多其他功能中的分页功能。
您可以非常轻松地在数据库中存储您的搜索字词,并返回适用于您的搜索查询的ID。我们目前使用它将所有数据存储为文档,但有很多人使用它来进行所有搜索。
您只需复制机器上的exe并运行它即可。然后你有一个REST api,允许你与它进行通信。 Nest抽象了这个。
您可以使用Nest构建动态查询,只需添加到搜索对象上,或者如果您愿意,可以构建一个传入的json对象。