I suggest full-text search (MS or Lucene will work). The code below uses MSSQL FTS as its what I am currently using in my application.
Install FTS Search if you haven’t already. If you checked that the service is running. In the management studio, run this to set up a catalog and add a product table; and color / name / product number in the catalog.
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
Then you can run queries on all columns at the same time; e.g. Silver (selected as color and name)
Select * from production.product where contains(*, '"Silver*"')
Silver * will be found in the query so that you can use it to create results as you type. Keep in mind that Google does this work in real time - if you are looking for a lot of data in order to be able to return data without interrupting user input. I think that people usually use these searches by typing the first letter they are looking for - I agree that there will be spelling errors - you can implement a spellcheck after every place that they may click to handle it. Or save your searches and look at the wrong names and change the code for processing based on matching (or in the FTS using a custom thesaurus.)
Rating will be an interesting problem for the development of any business; Do you find the first result for Mountain Frame - or do you want to weigh them by sales or price? If a user enters more than one text term, you can use FTS to create a ranking based on a search string.
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
This returns 30 rows; and weights based on user input to determine the first place record. In any case, you most likely want to add a coded rating to customize the results in accordance with your business needs - the rating of the most expensive widget 1 may not be. That's why you are going to store what you were looking for or clicking on people to analyze the results later.
There is a really good language parser for .Net, which converts a google style string query, introduced into the FTS'able language, which gives knowledge of any logical queries that your site uses.
You can also add some wisdom to the crowd functions by checking what the users have, and eventually set off to visit and use the success cards to modify the final offers to actually make them relevant to the user.
As a final suggestion, if this is a commercial site, you can look at Easyask , which is a scary big natural language processor