Dan*_*anP 5 sql nhibernate search sql-server-2008
我有一个应用程序允许基于几个不同的标准(总共20种不同方法的顺序)搜索某个实体.我希望能够组合几个搜索的结果,以便生成单个结果集.
例如:
results = (entities from search 1 AND entities from search 2) OR (entities from search 3)
Run Code Online (Sandbox Code Playgroud)
让我们假设搜索本质上足够复杂,因此无法将它们组合成单个逻辑查询(由于需要查询的复杂关系等).
我们还假设所涉及的实体数量(可能)使得任何类型的内存中策略都不可行.
我最初的想法是:
1)单独执行搜索,从每个搜索中获取匹配的"实体ID"列表,然后根据这些搜索执行"根级"搜索.
例如:
select * from entity e
where
(e.Id in (search 1 id list) AND e.Id in(search 2 id list))
OR e.Id in (search 3 id list)
Run Code Online (Sandbox Code Playgroud)
2)执行外部查询,根据我的(复杂)子查询返回的结果选择实体.
例如:
select * from entity e
where (e.Id in (select e1.id from entity e1 where ...) AND e.Id in (select e2.id from entity e2 where...))
OR e.Id in (select e3.id from entity e3 where...)
Run Code Online (Sandbox Code Playgroud)
显然,出于说明目的,这些示例被大大简化; 各个查询将更加复杂,它们的组合将是任意的(我刚刚在这里举例说明了一个代表性的例子).
我非常有兴趣听取别人如何处理这种情况的建议.我当然愿意接受我上面没有探讨过的任何可能性.
作为参考,这是一个.NET应用程序,它使用由SQL Server 2008 R2数据库支持的NHibernate ORM.
我已经决定使用hql或native sql,因为ICriteria或Linq不提供执行单个查询所需的灵活性,也不提供所需的组合操作.
我通过将搜索性能计数器保存在表中来完成此操作。基本上监视搜索过滤的行的平均百分比和运行时间。
然后,我根据 TotalNumberOfRowsToSearch * Percent_Not_Matched / RunTimeInSeconds 创建一个性能数字。该数字是它可以过滤掉的每秒行数的直接相关性。经过数千次运行的平均,这是一个相当不错的预测。
然后,我按照性能最高的数字第一个的顺序运行每个查询。
如果您要对总结果执行逻辑 AND,则仅对前一个查询的结果运行每个后续查询。
如果您正在执行逻辑 OR,则仅对结果运行每个后续查询,而不是在组合的先前搜索结果中。
通过这种方式,您的查询将根据索引和数据类型而改变。
如果您想要一个不太动态的解决方案,只需计算搜索的每个部分的性能数据,并首先使用性能较好的部分。请记住,运行 55 毫秒但匹配 99% 结果的查询不如运行 1 秒并匹配 1% 结果的查询有用,因此请注意结果可能与您最初的想法相悖。
计算性能数据时,请注意除以 0 的错误。
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |