PDA

View Full Version : Full-text search indexes چیه و چطور می تونم اون رو روی یه فیلد ست کنم؟



idocsidocs
یک شنبه 12 شهریور 1391, 12:15 عصر
لطفا بگید که :
Full-text search indexes چیه؟
چه مزیتها و چه معایبی داره؟
کجا باید ازش استفاده کنم و کجا نباید ازش استفاده کنم؟
چطور می تونم اون رو روی یه فیلد ست کنم؟

idocsidocs
یک شنبه 12 شهریور 1391, 22:10 عصر
کسی در این مورد اطلاعی نداره؟

AbiriAmir
دوشنبه 13 شهریور 1391, 16:09 عصر
1 قابلیت برای جستجو هست...
مزیت هاش اینه که جست و جو رو راحت میکنه... جست و جو رو بهینه میکنه... مثلا تشخیص میده و کلماتی مثل "و"، "که" و ... که تو خیلی از رکورد ها هست رو نمیاره... و این که تا اونجایی که یادمه کلمات هم خانواده رو هم یکی حساب میکنه (فکر کنم mysql این قابلیت رو نداشت)
معایبش هم اینه که من هیچوقت نتونستم درست ازش استفاده کنم! یعنی جواب درست و راست نمیداد! به نظرم ایدش خوبه اما زیاد کارکردش کاربردی نیست! (البته برای من نبوده... نمیدونم)
و این که InnoDB فعلا ساپورتش نمیکنه ( در mysql 5.6 این مشکل حل شده )

ضمنا 1 قابلیتای خوبی هم داره مثلا میشه تعیین کرد که فلان کلمه در سرچ تاثیر مثبت داره و فلان کلمه تاثیر منفی... فلان کلمه باشه و فلان کلمه نباشه..

http://en.wikipedia.org/wiki/Full_text_search

AbiriAmir
دوشنبه 13 شهریور 1391, 16:14 عصر
این هم جالبه:


امکان دیگری که به نظر می رسد تنها از طریق جداول MyISAM در MySQL در دسترس FullText Searching است ، اندیسهای معمولی برای پیدا کردن سطرهایی خاص از جدول به خوبی کار می کنند اما جستجو برای یک کلمه یا رشته در یک متن هم امکان جالبی به نظر می رسد. شما با استفاده از کد SQL زیر می توانید یک جدول MyISAM با FullText یک اندیس بسازید.

CREATE TABLE articles (
articleID int not null auto_increment primary key,
title varchar(2MERGE),
body text,
fulltext (title,body)
);

و با استفاده از query زیر به دنبال هر رکورد حاوی miniprogrammer بگردید!

SELECT title
FROM article
WHERE MATCH (title, body) AGAINST ('miniprogrammer');

شما امکان گرفتن query های پیچیده تر را هم دارید:

SELECT title
FROM article
WHERE MATCH (title, body) AGAINST ('miniprogrammer apache php
web');

حالا ما به دنبال هر رکوردی هستیم که حاوی هر یک از کلمات فوق باشد. متاسفانه در حال حاضر MySQL از Stemming پشتیبانی نمی کند ، Stemming امکان فوق العاده جالبی است که در خیلی از سیستمهای جستجوی fulltext وجود دارد و با استفاده از آن مثلا اگر شما کلمه acquire را جستجو کنید کلمه acquisitions هم که از همان رده معنایی است بازگردانده می شود، هر کدام از این کلمات برحسب میزان وابستگی معنایی مقدار دهی می شوند و بعد از آن بر همین میزان مرتب می شوند و نتایج بازگشت داده می شوند.

قابلیت بسیار جالب دیگری که در حالت Full-Text به دست می آورید Boolean Full-Text Search است که بسیار جالبتر از Full-Text خالی است!

SELECT title
FROM article
WHERE MATCH (title,body)
AGAINST ('+linux+”Open Source” -desktop Java ~Oracle' IN
BOOLEAN MODE);

در query بالا شما به دنبال رکوردهایی می گردید که دارای کلمه Open Source و linux باشند اما کلمه desktop را نداشته باشند، کلمات Oracle و Java به دلخواه وجود داشته باشند اما هنگام مرتب سازی رکوردها برای مشخص شدن میزان وابستگی به مورد جستجوی ما وجود کلمه Java باعث افزایش امتیاز و Oracle باعث کاهش امتیاز شود.

idocsidocs
دوشنبه 13 شهریور 1391, 17:21 عصر
ضمنا 1 قابلیتای خوبی هم داره مثلا میشه تعیین کرد که فلان کلمه در سرچ تاثیر مثبت داره و فلان کلمه تاثیر منفی... فلان کلمه باشه و فلان کلمه نباشه..
درکل می دونم کارش چیه ولی طرز استفاده از اون رو بلد نیستم !

AbiriAmir
سه شنبه 14 شهریور 1391, 11:35 صبح
مثلا شما میخواین تو 2 تا فیلد title و text جستجو کنید
روش کار اینه که هر 2 فیلد با هم Fulltext index بشن... (نه جدا جدا)
-->
CREATE FULLTEXT INDEX `myindex` ON `tblname` (`title`, `text`);

این برای ساختن ایندکس بود

حالا برای جستجو:



SELECT *
FROM `tblname`
WHERE MATCH (title, text)
AGAINST ('+linux+"Open Source" -desktop Java ~Oracle' IN
BOOLEAN MODE);


در query بالا شما به دنبال رکوردهایی می گردید که دارای کلمه Open Source و linux باشند اما کلمه desktop را نداشته باشند، کلمات Oracle و Java به دلخواه وجود داشته باشند اما هنگام مرتب سازی رکوردها برای مشخص شدن میزان وابستگی به مورد جستجوی ما وجود کلمه Java باعث افزایش امتیاز و Oracle باعث کاهش امتیاز شود.

idocsidocs
سه شنبه 14 شهریور 1391, 13:40 عصر
فقط همین کوئری کافیه؟

CREATE FULLTEXT INDEX `myindex` ON `tblname` (`title`, `text`);

AbiriAmir
پنج شنبه 16 شهریور 1391, 15:57 عصر
برای ساخت INDEX بله کافیه
البته از ALTER TABLE هم میتونید استفاده کنید

idocsidocs
پنج شنبه 16 شهریور 1391, 16:05 عصر
توی phpmyadmin چطور باید این کار رو انجام بدم؟

AbiriAmir
پنج شنبه 16 شهریور 1391, 16:09 عصر
از قسمت SQL کدهای sql که بهتون دادم رو اجرا کنید...
تو بعضی از نسخه های PHPMYADMIN دیدم FULLTEXT INDEX رو داره اما با کوئری راحت ترید...
کوئری پیچیده ای که نداره