Ще предложа пълнотекстово търсене (MS' или Lucene ще работят) Кодът по-долу използва MSSQL FTS като това, което използвам в приложението си в момента.
Инсталирайте FTS Search, ако още не сте го направили. Ако сте проверили дали услугата работи. В студио за управление стартирайте това, за да настроите каталог и да добавите таблицата с продуктите; и Цвят / Име / Номер на продукта към каталога.
USE [AdventureWorks]
GO
CREATE FULLTEXT CATALOG [ProductsTest]WITH ACCENT_SENSITIVITY = OFF
AUTHORIZATION [dbo]
GO
USE [AdventureWorks]
GO
CREATE FULLTEXT INDEX ON [Production].[Product] KEY INDEX [PK_Product_ProductID] ON ([ProductsTest]) WITH (CHANGE_TRACKING AUTO)
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Color])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Name])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([ProductNumber])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ENABLE
GO
След това можете да изпълнявате заявки към всички колони наведнъж; напр. Сребро (Избрано по цвят и име)
Select * from production.product where
contains(*, '"Silver*"')
* в заявката ще намери Silver*, така че можете да използвате това, за да изградите резултати, докато потребителят въвежда. Едно нещо, което трябва да имате предвид е, че Google прави това да работи в реално време - ако търсите много данни, можете за да получите обратно данните, без да прекъсвате въвеждането на потребителя. Мисля, че обикновено хората използват тези търсения, като въвеждат от първата буква, която търсят - приемам, че ще има правописни грешки - бихте могли да приложите проверка на правописа след всеки интервал, който натиснат, може би, за да се справите с това. Или съхранете търсенията, които се изпълняват, и разгледайте правописните грешки и променете кода, за да се справи с това въз основа на съпоставяне (или в FTS, използвайки персонализиран тезаурус.)
Класирането ще бъде забавен проблем за развитие на всеки бизнес; намирате ли първия резултат за Mountain Frame - или искате да ги претеглите по продажби или цена? Ако потребителят въведе повече от един текстов термин, можете да използвате FTS, за да създадете класиране въз основа на низа за търсене.
select aa.rank, bb.*
From containstable(production.product, *, '"Mountain" and "Silver*"') aa
inner join production.product bb
on aa.[key] = bb.productid
order by rank desc
Това връща 30 реда; и тегла въз основа на въведения от потребителя текст, за да се определи записът на първо място. И в двата случая най-вероятно ще искате да добавите кодирано класиране, за да коригирате резултатите, за да отговарят на вашите бизнес желания - класирането на джаджа с най-висока цена 1 може да не е начинът. Ето защо ще съхранявате това, което хората са търсили/кликнали, за да можете да анализирате резултатите по-късно.
Има наистина хубав езиков анализатор за .Net, който превежда въведена заявка за низ в стила на Google на език, който може да използва FTS, което дава познания за всички булеви търсения, които използват вашия сайт.
Може също така да искате да добавите някои функции на мъдростта на тълпите, като проверявате какво са въвели потребителите и в крайна сметка са ги посетили, и използвайте карти на успеха, за да промените окончателните предложения, за да ги направите действително подходящи за потребителя.
Като последно предложение, ако това е търговски уебсайт, може да искате да разгледате Easyask което е плашещо страхотен процесор за естествен език