亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 String.IndexOf 或 MS SQL 進行快速全文搜索

使用 String.IndexOf 或 MS SQL 進行快速全文搜索

C#
蝴蝶不菲 2022-09-04 16:24:15
我有一個情況,我需要一個超快速的全文通配符搜索。以前,我只使用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 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

據我所知,在任何現代SQL數據庫中都沒有這樣的解決方案。它們根本不是為像您這樣的用例而設計的。

對于這樣的解決方案,你真的需要看看像彈性搜索Azure搜索這樣的解決方案,即使是那些需要你使用特殊構造和過濾器來實現純通配符搜索功能的解決方案。


查看完整回答
反對 回復 2022-09-04
?
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%'


最后要注意的是,您可以使用觸發器使該表保持最新狀態。


查看完整回答
反對 回復 2022-09-04
  • 2 回答
  • 0 關注
  • 128 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號