2010-08-24 2 views
4

Я чувствую себя немного новичка отправляю это, но все равно:Лучший способ для сравнения сложных строк в SQL или .NET

У меня есть большое количество деталей штока, 3000-5000, которые имеют сложные названия, на основе от того, кто вошел в пункты более в течение 16 лет, и пример названия:

"Food, Dog, Pal Meaty Bites chunks 8kg bag" 

Другой, связанный элемент называется:

"DOG FOOD: Meaty Bites (Pal) 22kg bag" 

проблема заключается в том, что у меня есть список элементов из ряда поставщикам, с обновленными ценами, которые мне нужно сопоставить с нашим существующим списком акций. В первый раз, когда я получаю список, я хочу попытаться выполнить поиск «ближайшего совпадения» и представить пользователю список наших текущих имен позиций, которые могут совпадать с именем товарного запаса поставщиков. Затем пользователь выберет правильный SKU, и приложение импортирует элемент поставщика и свяжется с нашей столовой таблицей PK.

Название от поставщика также будет меняться. Пример:

"Pal Meaty Bites Chunks 8kg" 

Я могу выполнить матч в SQL или .NET, который вы когда-либо рекомендовали. Я хочу представить пользователю как можно меньше элементов, основываясь на наибольшем числе ключевых слов. Мои идеи до сих пор таковы:

В .Net: перерыв в массив и поиск по каждому ключевому слову для каждого элемента (медленный) В SQL: используйте полный текстовый индекс и разделите его на ключевые слова, используя возвращаемый список «ИЛИ» на ранг с обрезанием

Это должен быть общий сценарий, я просто не уверен в том, как это сделать. Спасибо за ваш вклад!

Редактировать: Добавлено несколько контекстов: У нас есть таблица SKU, которая содержит около 20 полей, включая StockKeepingUnitID, которая является уникальной идентификацией PK (int identity). Продукты поставщиков втягиваются в таблицу под названием StockOrderUnit, которая имеет FK of SupplierID и StockKeepingUnitID, и имеет поле под названием SupplierCode (varchar), которое содержит уникальный код поставщиков для этой позиции запаса. Проблема заключается в том, что многие поставщики отправляют нам прайс-листы, и пользователь может сопоставить уже имеющиеся элементы поставщика (которые неизвестны на данный момент) уже существующим SKU в БД. После их выбора записи объединяются.

+0

Какая версия SQL Server? Если SQL 2008 полностью проиндексированы текстом слова довольно легко доступны для запроса. –

ответ

3

Определенно верните это обратно в код клиента, а не в БД. Это позволит вам, как вы говорите, создать счет матчей и разрешить пользователю выбирать/подтверждать автоматические матчи.

Я бы взял его, разделив на массив, преобразовывая в нижний регистр, а затем сортируя по алфавиту. Возможно, попробуйте переместить термины с числами в них на фронт массива. Верните все это обратно в строку, чтобы помочь пользователю распознавать совпадения с некоторой согласованностью.

Я бы сговорился сделать это автоматически и без наблюдения пользователя в сценарии SQL. Возможно, пользователям может быть дана оценка, и они должны принимать решения только под некоторым порогом.

+0

Спасибо. Это то, что я сделал. Он не будет полностью автоматизирован, просто назовите 5-10 лучших совпадений для пользователя. Если им придется искать, они этого не сделают! Причина, по которой я размышлял о SQL, заключается в том, чтобы использовать Full Text Index, но все равно придется очищать результаты .NEt, как я полагаю. Спасибо за Ваш ответ. – Molloch

1

Для выполнения таких запросов можно использовать ключевое слово SQL LIKE.

select fld1, fld2 from ProductTable where fld1 LIKE '%Meaty Bites%'; 

пардон, если у вас уже есть один, но если у вас нет SKU (Stock Keeping Unit) системы для любви человечества создать.Как минимум создайте уникальный первичный ключ, который автоматически увеличивает (идентичность) и применяет его ко всем вашим записям. Затем используйте это для поиска и т. Д.

Используя «как», гораздо меньше записей попадет на провод, и вам не придется писать кучу кода для выполнения работы.

+0

Спасибо. Я просто был краток ради поста. У нас есть таблица SKU, которая содержит около 20 полей, включая StockKeepingUnitID, которая является уникальной идентификацией PK int. Продукты поставщиков втягиваются в таблицу под названием StockOrderUnit, которая имеет FK ProviderID и StockKeepingUnitID, и имеет поле под названием SupplierCode (varchar), которое содержит уникальный код поставщиков для этого элемента запаса. Проблема заключается в том, что многочисленные поставщики отправляют нам прайс-листы, и до того, как пользователь уже сопоставляет элементы поставщика (которые неизвестны на данный момент) с существующими SKU в базе данных. – Molloch

+0

@ Molloch Gotcha '. Продолжайте бороться с хорошей борьбой. :-) Помните, что «like» возвращает результирующий набор не только одной записи. – JustBoo

1

Вы можете использовать оба подхода.
Разделите и выполните базовое сопоставление в SQL.
Затем запишите результаты .Net

Ваше базовое соответствие в SQL может быть таким же простым, как и большой список всех вещей, которые соответствуют нескольким словам.

Тогда ваш выигрыш в .Net - это место, где произойдет настоящая «магия».

Смежные вопросы