我有一个情况,我需要一个超快速的全文通配符搜索。
以前,我只使用SQL存储过程,该过程将对具有多个联接的表执行搜索,并使用查询,但是对于几百万条记录,它非常慢。LIKE '%searchTerm%'
我尝试过在SQL中进行全文索引和搜索,但是,这似乎不起作用,因为它会在单词上中断,但我需要搜索字符串的中间。
更改为一个新的 SQL 存储过程,该过程将所有搜索字段连接成一个字符串,并使用对象 ID 的另一列返回该字符串 - 然后将整个对象作为 C# 中的 a 缓存(特别是作为 C# 中的静态对象),并使用检查搜索字符串的逻辑似乎大大提高了性能(从大约 10 秒增加到大约 100 毫秒)。List<>AppPoolIndexOf()
我担心的是,这是否是一个糟糕的方法,或者是否有更好的方法?
创建要与对象 ID 关联的搜索字符串的新 SQL 存储过程如下所示:
CREATE PROCEDURE [dbo].[Search_GetLookupTable]
AS
BEGIN
SELECT
ObjectId,
(Name + ' ' + OtherName + ' ' + ep.SomethingElse + ISNULL(
(
SELECT
' ' + twl.SomeBindingName
FROM
TableWithLotsOfBindings twl
WHERE
twl.ObjectId = e.ObjectId
FOR XML PATH('')
)
, '')) AS SearchString,
ep.LastActionDateTime AS OrderDate
FROM
ObjectTable e
INNER JOIN ObjectMetaData ep ON ep.ObjectId = e.ObjectId
END
GO
然后,这会被加载到具有 and 的模型中。然后,我将它保存到搜索中的属性中,然后跟踪上次加载并每隔10分钟左右回收一次。List<>ObjectIdSearchStringstaticclassDateTime
我最初也将其保存到分布式内存中缓存中,但是,性能非常差,序列化和传输数据。
private static readonly List<GlobalSearchLookupModel> _CachedSearchLookupModel = new List<GlobalSearchLookupModel>();
private static DateTime _CacheSearchLookupModelDateTime = DateTime.MinValue;
List<GlobalSearchLookupModel> lookupModels = _CachedSearchLookupModel.Value;
if (lookupModels == null)
{
lookupModels = SqlClass.SearchLookupTable();
_CachedSearchLookupModel.Value.Clear();
_CachedSearchLookupModel.Value.AddRange(lookupModels);
_CachedSearchLookupModelDateTime = DateTime.UtcNow;
}
郎朗坤
HUX布斯
相关分类