PDA

View Full Version : تشخیص درخواست کاربر با استفاده از کلمات کلیدی در sql



Mehdi Tahmasebi
شنبه 15 بهمن 1390, 16:24 عصر
سلام دوستان

من یه لیست از کلمات کلیدی دارم که در یک جدول در بانک اطلاعاتی ذخیره شده است. حالا می خوام هر وقت که درخواستی (پیام متنی) از طرف کابر دریافت کردم در لیست کلمات کلیدی جستجو کنم و ببینم که کاربر از کدام کلمات کلیدی استفاده کرده و درخواست کاربر را متوجه بشم
توجه کنید که کابر در هر درخواست از چند کلمه کلیدی استفاده می کند و ممکن است در درخواست کاربر از کلمات اضافی هم استفاده شده باشد
این برنامه را می توان با استفاده از کرسر ها نوشت اما من می خوام بدونم آیا روش ساده تری با استفاده از چند دستور select ساده و like و in معمولی وجود داره یا نه؟
ضمنا اگه دوستان حرفه ای سایت روش های مناسب تری با استفاده از درخت ها ، لیست های پیوندی و ... سراغ دارند لطفا راهنمایی کنن!:متفکر::متفکر::متفکر::متف کر:

با تشکر از دوستان زحمت کش...:تشویق::تشویق::تشویق:

یوسف زالی
شنبه 15 بهمن 1390, 17:04 عصر
منظورتون رو واضح تر بیان کنید و مثال بزنید.
به نظر می رسه که سمت UI بشه بهتر کنترل کرد تا SQL.
به هر حال بگید که برای چه کاری می خواهید؟

Galawij
شنبه 15 بهمن 1390, 17:35 عصر
سلام،
شما سعی کنید در رشته ای که کاربر می فرسته یک کاراکتر جدا کننده بذارید مثل: ','، ';'،'.'، و ....
بعد از طریق توابع SQL(اگر تعداد حروف کم هست:PARSENAME، و یا ترکیبی از Substring و Charindex) تک تک این کلمه ها را بدست بیارید و با کلمات کلیدی داخل جدول (فکر کنم با Case ....when ... then بشه) مقایسه کنید.

یوسف زالی
شنبه 15 بهمن 1390, 18:42 عصر
دوست من ببینید ممکنه بخواهید در شرط where استفاده کنید، در این صورت اصلا نیازی به parse کردن ندارید. ممکنه بخواهید در join استفاده کنید، قضیه فرق می کنه.
مثال زیر رو ببینید:

declare @X varchar(max) = '''hello'', ''test'', ''hi'', ''word4''' -- sql
declare @Qry varchar(max) = 'select * from TBL where Field in ( ' + @X + ')' -- where test
exec(@Qry) -- result

اگر توضیح بدید بهتر می شه کمک کرد.

Mehdi Tahmasebi
شنبه 15 بهمن 1390, 18:55 عصر
با تشکر از You-See و Galawij عزیز به خاطر توجه تون:

گفتین واضح تر بگم.
من می خوام یه سیستم ارسال و دریافت sms درست کنم. استفاده کننده های سیستم برای دریافت بعضی سرویس های ارائه شده می تونن ثبت نام کنند. ثبت نام با ارسال چند کلمه کلیدی باید صورت بگیره. مثلا یک سرویس داریم که کاربر برای ثبت نام در اون باید 1- نام سرویس 2-نام استان 3-نام شهر خودشو ارسال کنه ؛ نام سرویس ها ، استان ها و شهرها و سایر کلمات کلیدی مورد نیاز در جداولی در بانک اطلاعاتی ذخیره شده (مثلا در جدولی بنام ServiceList در فیلد اول نام سرویس ، در فیلد دوم نام استان ، در فیلد سوم نام شهر و... ذخیره شده )
حالا هر وقت پیامی از سوی کاربران دریافت شد باید بررسی بشه که کدوم کلمات کلیدی در متن پیام اومده با فهمیدن اون ها قسمت عمده کار انجام شده
من دنبال یه روش ساده و کارآمد هستم...
مثلا میشه از کرسرها استفاده کرد و با خوندن رکورد به رکورد جدول کلمات کلیدی و جستجوی اون ها در متن دریافتی، کلمات کلیدی استفاده شده رو استخراج کرده و تصمیم گیری نمود.
شاید هم بشه از دستور select , like , in ,any و... استفاده کرد اما یه مشکلاتی هست...

نظر شما چیه؟ بهترین روش کدومه؟:لبخندساده::گیج:

Mehdi Tahmasebi
شنبه 15 بهمن 1390, 19:26 عصر
ببینید من می تونم از یه دستور select استفاده کنم

پیام دریافتی از کاربر، توی یه فیلد بنام message در جدولی به نام RecieveMSG قرار داره
serviceName , Province , City
هم مثلا کلمات کلیدی ما هستن (عنوان فیلدها)
SRVkey
هم جدول کلمات کلیدی هستش
SELECT serviceName , Province , City FROM SRVkey
WHERE …….
حالا مسئله اینه که where رو چطور بنویسم؟

Mehdi Tahmasebi
شنبه 15 بهمن 1390, 19:37 عصر
سلام،
شما سعی کنید در رشته ای که کاربر می فرسته یک کاراکتر جدا کننده بذارید مثل: ','، ';'،'.'، و ....
بعد از طریق توابع SQL(اگر تعداد حروف کم هست:PARSENAME، و یا ترکیبی از Substring و Charindex) تک تک این کلمه ها را بدست بیارید و با کلمات کلیدی داخل جدول (فکر کنم با Case ....when ... then بشه) مقایسه کنید.

یکی از مشکلات اساسی اینه که توابع قدرتمندی برای جستجوی یک رشته در رشته دیگر در sql وجود نداره مثلا اگه میشد یک سری کلمات (ذخیره شده در یک جدول بانک) رو به راحتی در یک متن جستجو می کرد خیلی راحت مسئله حل می شد البته مانورهای زیادی روی ترکیب تابع Charindex همراه با دستور select داد اما من زیاد با ترکیب اینها کار نکردم . ریزه کار هم زیاد داره!!!

ممنون....

Galawij
شنبه 15 بهمن 1390, 21:14 عصر
خیلی مشکلات در رابطه با SQL پیش میاد که در حین کار واقعاً آدم متوجه می شه.
فرض کنیم شما مقادیر ورودی کاربر را در سه متغیر جداگانه داشته باشید، برای این قسمت می تونید این لینک (http://barnamenevis.org/showthread.php?304832-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-IN-%D8%AF%D8%B1-%D8%A7%D8%B3%D8%AA%D9%88%D8%B1%D9%BE%D8%B1%D9%88%D 8%B3%DB%8C%D8%AC%D8%B1) را ببینید.

پیام دریافتی از کاربر، توی یه فیلد بنام message در جدولی به نام RecieveMSG قرار داره
serviceName , Province , City
هم مثلا کلمات کلیدی ما هستن (عنوان فیلدها)
SRVkey
هم جدول کلمات کلیدی هستش
SELECT serviceName , Province , City FROM SRVkey
WHERE …….
حالا مسئله اینه که where رو چطور بنویسم؟
من فکر می کنم اصلاً Where نمی خواد، یک کمی هم روی case کار کنید. مثلاً:
with CTE AS (
select case when str like '%string%' then str end as city,case when id=3 then 'id' end as id from dbo.strings)
select city,id from CTE where city is not null or id is not null
برای ارسال متغیرها هم از sql پویا استفاده کنید.

baktash.n81@gmail.com
یک شنبه 16 بهمن 1390, 07:30 صبح
سلام

خوب همونطوری که دوستان گفتن ... و از نظر من انجام اینکار در SQL کار درستی نیست ... هم زمان طراحی هم زمان اجرا و هم در آینده در هنگام توسعه به مشکلات زیادی بر خواهید خورد ... کار درست اینه که در لایه APP این کارو انجام بدید ... ابزارها در لایه APP هم سریعتر هستند هم قویتر ... ضمن اینکه شما می تونید پارسر خودتون رو اونجا به عنوان یه ابزار ایجاد کنید ... و ارتقاعش بدید ... و در آخر هم اینکه SQL در کار با رشته ها نسبت به زبانهای برنامه نویسی خیلی کنده ...

Mehdi Tahmasebi
یک شنبه 16 بهمن 1390, 09:08 صبح
سلام

خوب همونطوری که دوستان گفتن ... و از نظر من انجام اینکار در SQL کار درستی نیست ... هم زمان طراحی هم زمان اجرا و هم در آینده در هنگام توسعه به مشکلات زیادی بر خواهید خورد ... کار درست اینه که در لایه APP این کارو انجام بدید ... ابزارها در لایه APP هم سریعتر هستند هم قویتر ... ضمن اینکه شما می تونید پارسر خودتون رو اونجا به عنوان یه ابزار ایجاد کنید ... و ارتقاعش بدید ... و در آخر هم اینکه SQL در کار با رشته ها نسبت به زبانهای برنامه نویسی خیلی کنده ...


میشه لطف کنید چند تا از ابزارهای سریع و قوی که در لایه APP سراغ دارین رو معرفی کنید؟ درکل شما چه الگوریتمی پیشنهاد می کنین؟
تصور من این بوده که اگه پردازش درخواست هام رو به سمت sql ببرم باعث یکپارچگی و قدرت نرم افزارم میشه اما گویا اطلاعات شما میگه اینطور نیست. همچنین توابع درون ساخت قوی هم در sql برای کار با رشته ها وجود نداره و این باعث مشکل برای من شده!

baktash.n81@gmail.com
یک شنبه 16 بهمن 1390, 15:36 عصر
البته این نکته رو اضافه کنم که می تونید از SQL CLR هم استفاده کنید یعنی توابع مورد نیاز رو در یه زبان برنامه نویسی به صورت dll ایجاد کنید بعد dll رو در TSql به عنووان Refrence معرفی کنید و از توابعش استفاده کنید.

من یادمه دوران دانشجویی برای درس کامپایلر یه parser نوشتم .. کارکترها رو تک تک می خوند ... تا به یک جدا کننده برسه (جدا کننده قابل تعریف) بعد کلمه پیدا شده رو با کلماتی که به عنوان کلمات کلیدی تعریف شده بود مقایسه می کرد اگر جزو اونا بود ID اون کلمه رو استخراج می کرد ... البته دنبال الگو های خاص هم می گشت که ... شما هم الگوریتم خودتون رو بنویسید ...

اما منظورم از ابزار قدرتمند و سریع ... کامپایلرهای بهتر ... و توابع موجود در زبانهای مختلف برای کار با رشته ها است ... در نهایت هم نتیجه این ابزارها که یم APP خواهد بود خیلی سریعتر از SQL کار خواهد کرد.

امید که کمکی شده باشه ...