我有一個情況,我需要一個超快速的全文通配符搜索。以前,我只使用SQL存儲過程,該過程將對具有多個聯接的表執行搜索,并使用查詢,但是對于幾百萬條記錄,它非常慢。LIKE '%searchTerm%'我嘗試過在SQL中進行全文索引和搜索,但是,這似乎不起作用,因為它會在單詞上中斷,但我需要搜索字符串的中間。更改為一個新的 SQL 存儲過程,該過程將所有搜索字段連接成一個字符串,并使用對象 ID 的另一列返回該字符串 - 然后將整個對象作為 C# 中的 a 緩存(特別是作為 C# 中的靜態對象),并使用檢查搜索字符串的邏輯似乎大大提高了性能(從大約 10 秒增加到大約 100 毫秒)。List<>AppPoolIndexOf()我擔心的是,這是否是一個糟糕的方法,或者是否有更好的方法?創建要與對象 ID 關聯的搜索字符串的新 SQL 存儲過程如下所示:CREATE PROCEDURE [dbo].[Search_GetLookupTable]ASBEGIN 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.ObjectIdEND 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;}
2 回答

HUX布斯
TA貢獻1876條經驗 獲得超6個贊
您可以嘗試使用以下想法在SQL中構建自己的searchindex:
假設您的表是
MyTable(Id bigint Primary Key, Text nvarchar(max))
,其中是要在其中搜索的列。Text
然后構建一個表
IndexTable(TextIndex nvarchar(max) Primary Key, Id bigint)
,外鍵為 。IdMyTable
現在,您可以使用 MyTable 中包含的文本的所有后綴填充該表。
現在可以重寫查詢
SELECT *
FROM MyTable
WHERE Text LIKE '%searchTerm%'
to
SELECT *
FROM MyTable
WHERE Id IN (SELECT Id FROM IndexTable WHERE TextIndex LIKE 'searchTerm%')
(此查詢也可以使用聯接編寫,但隨后可能會導致重復)
這應該是一個有效的查詢,因為可以使用索引表的PK索引。LIKE 'searchTerm%'
最后要注意的是,您可以使用觸發器使該表保持最新狀態。
- 2 回答
- 0 關注
- 128 瀏覽
添加回答
舉報
0/150
提交
取消