У меня есть база данных, в которой я возвращаю информацию о нескольких объектах в одном свободном текстовом поиске, вот пример базы данных:
dbo.Electrician
ElectricianId | Company | TelNo | Mobile | Addr1 | Postcode
123 | Sparky 1 | 01234567 | 0789078 | 42 lower ave | Ex2345
124 | Sparky 2 | 01235678 | 0777777 | 1 Street | Ta6547
125 | Sparky 3 | 05415644 | 0799078 | 4 Air Road | Gl4126
dbo.Painters
PainterId | Company | TelNo | Mobile | Addr1 | Postcode
333 | Painter 1 | 01234568 | 07232444 | 4 Higher ave | Ex2345
334 | Painter 2 | 01235679 | 07879879 | 5 Street | Ta6547
335 | Painter 3 | 05415645 | 07654654 | 5 Sky Road | Gl4126
dbo.Clients
ClientId | Name | TelNo | Mobile | Addr1 | Postcode
100333 | Mr Chester | 0154 5478 | 07878979 | 9 String Rd | PL41 1X
100334 | Mrs Garrix | 0254 6511 | 07126344 | 10 String Rd | PL41 1X
100335 | Ms Indy Pendant | 0208 1154 | 07665654 | 11 String Rd | PL41 1X
Мой текущий метод работает так:
Создать временную таблицу (EntityId, DisplayName, LongName, EntityType)
Возьмите условия поиска и замените ненужные символы перед заменой пробелов запятыми и использованием этого в качестве CSV.
SET @searchTerms = LTRIM(RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(LTRIM(RTRIM(@searchTerms)), ',', ' '),
'[', ''),
']', ''),
'#', ''),
'&', ''),
';', ''),
'?', ''),
'`', ''),
'''', ''),
'*', ''),
'"', ''),
'<', ' '),
'>', ' '),
'-', ' '),
'(', ' '),
')', ' '),
'\', ' '),
'/', ' ')))
SET @searchTerms = REPLACE(@searchTerms, ' ', ',')
DECLARE @SearchTerm AS nvarchar(50);
DECLARE @DevelopmentCursor AS CURSOR;
SET @DevelopmentCursor = CURSOR
FOR
SELECT
*
FROM general.Csvtoquery(@searchTerms)
WHERE value != ''
Далее я перебираю условия поиска, вставляя каждую сущность в мою временную таблицу:
INSERT INTO #tempsearchtable (EntityId, Name, LongName, EntityType)
SELECT
tc.ClientId,
tc.Title + ' ' + tc.FirstName + ' ' + tc.LastName,
tc.Title + ' ' + tc.FirstName + ' ' + tc.LastName + ', ' + COALESCE(a.NameOrNumber, '') + ', ' + COALESCE(a.Street, '') + ', ' + COALESCE(a.Town, '') + ', ' + + ', ' + COALESCE(a.County, '') + ', ' + COALESCE(a.Postcode, '') + ', ' + COALESCE(a.Country, '') + ', ' + COALESCE(tc.EmailAddress, '') + ', ' + COALESCE(REPLACE(tc.Telephone, ' ', ''), '') + ', ' + COALESCE(REPLACE(tc.Mobile, ' ', ''), ''),
'Client'
FROM
dbo.Clients tc
LEFT JOIN
dbo.[Address] a ON tc.AddressId = a.AddressId
WHERE
tc.FirstName LIKE '%' + @SearchTerm + '%'
OR tc.LastName LIKE '%' + @SearchTerm + '%'
OR tc.EmailAddress = @SearchTerm
OR REPLACE(tc.Telephone, ' ', '') LIKE '%' + @SearchTerm + '%'
OR REPLACE(tc.Mobile, ' ', '') LIKE '%' + @SearchTerm + '%'
OR a.NameOrNumber LIKE '%' + @SearchTerm + '%'
OR a.Street LIKE '%' + @SearchTerm + '%'
OR a.Postcode LIKE '%' + @SearchTerm + '%'
OR a.County LIKE '%' + @SearchTerm + '%'
OR a.Town LIKE '%' + @SearchTerm + '%'
OR a.Country LIKE '%' + @SearchTerm + '%'
Теперь я снова зацикливаю свои поиски. Это сделано для того, чтобы я получал только конкретные совпадения. Я удаляю все, где LongName не содержит моего поискового запроса.
Я выбираю все из временной таблицы перед тем, как бросить ее.
Хотя это работает и работает довольно хорошо, поиск идет медленнее, чем хотелось бы, и я искал предложения, чтобы ускорить это. Одним из них было создание индексной таблицы и добавление в нее всех сущностей, и только один цикл получения определенных поисков. Это немного быстрее, но это также означает, что у меня есть данные только для тех случаев, когда была задана последняя задача для сброса данных в индекс. Живые поиски являются обязательными.
Спасибо за любые предложения.