הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   חיפוש בבסיס נתונים: Like מורחב? (https://hosts.co.il/forums/showthread.php?t=94985)

Itay 27-01-12 13:58

אין פה שום חישוב של רלוונטיות לביטוי חיפוש במה שנתתי לך, אמרתי שעדיף לא להשתמש בזה..
MATCH AGAINST עושה את החיפוש הזה הרבה יותר טוב, הרבה יותר מהר והרבה יותר פשוט

dor77 27-01-12 14:45

גם זה לא פתר את הבעיה..חיפוש צולע במיוחד..
משתגע..
נוותר..
תודה.

Haimz 27-01-12 16:53

אולי תנסה לקרוא על זה: http://phpguide.co.il/%D7%97%D7%99%D...7%9C%D7%90.htm

dor77 27-01-12 17:18

ציטוט:

נכתב במקור על ידי HHaim (פרסם 833554)
אולי תנסה לקרוא על זה: http://phpguide.co.il/%D7%97%D7%99%D...7%9C%D7%90.htm

ניסיתי..לא משהו בכלל..
אני מחפש משהו שאם יש לי את המשפט הבא:

ילד חגג יום הולדת

אז אם ירשמו "ילד" יקבלו, אם ירשמו "הולדת" יקבלו..אם ירשמו "ילד הולדת" גם יקבלו..

תודה.

Haimz 27-01-12 20:47

משהו שרשמתי: (אין פה סידור של רלוונטיות)
PHP קוד:

<?php

    $connect 
mysql_connect("localhost","username","pass");
    
$db_select mysql_select_db("db"$connect);
    
    
$query "how to amazing hello man are you"// מילות חיפוש
    
$col "title"// העמודה
    
$density 2// אחד או שתיים - צפיפות המילים
    
    //---------------------------------------
    
    
$where = array();
    
$exploded explode(" "$query); // preg_split("/\s{1}/", $query);
    
$explode = array();
    
    if( 
$density == )
    {
        for( 
$x 0$x count($exploded); ++$x )
        {
            if( 
$x )
            {
                continue;
            }
            
            
$explode[$x] = trim($exploded[$x] . " " $exploded[$x 1]);
        }
    }
    else
    {
        
$explode explode(" "$query);
    }
    
    foreach( 
$explode as $q )
    {
        if( empty(
$q) )
            continue;
        
$where[] = $col" LIKE '%" .$q"%'";
    }
    
    
$whereSyntax implode(" OR "$where);
    
    if( !empty(
$whereSyntax) )
    {
        
$whereSyntax " WHERE " .$whereSyntax;
    }
    
    if( 
strtoupper(trim($whereSyntax)) == "WHERE" )
    {
        
$whereSyntax null;
    }
    
    
//---------------------------------------
    
    
$result mysql_query("SELECT " .$col" FROM tutorials" $whereSyntax);
    
    while( 
$row mysql_fetch_array($resultMYSQL_ASSOC) )
    {
        echo 
$row[$col] . "<br />\n";
    }

?>

אין פה סידור של רלוונטיות, יש לך אפשרות לשחק עם הצפיפות (המשתנה $density ) יכול להיות על אחד או שתיים, אם זה שתיים זה מחלק את המשפט מכל שתי מילים, אם זה על אחד זה מחלק אותו על כל מילה.

אבל כמו שאמרו לך פה, MATCH AGAINST זה הכי נוח לדעתי.

Itay 28-01-12 03:36

ציטוט:

נכתב במקור על ידי HHaim (פרסם 833575)
משהו שרשמתי: (אין פה סידור של רלוונטיות)
אין פה סידור של רלוונטיות, יש לך אפשרות לשחק עם הצפיפות (המשתנה $density ) יכול להיות על אחד או שתיים, אם זה שתיים זה מחלק את המשפט מכל שתי מילים, אם זה על אחד זה מחלק אותו על כל מילה.

אבל כמו שאמרו לך פה, MATCH AGAINST זה הכי נוח לדעתי.

אתה יודע שבלולאת for אתה קובע בכמה המשתנה עולה/יורד? אתה יכול במקום $x++ לרשום $x+=2 ולחסוך את התנאי שלך..
ד"א - אם הביטוי הוא אי זוגי זה יקצץ מילה בסוף

ועוד ד"א.. מה ההגיון פה?
PHP קוד:

 $whereSyntax implode(" OR "$where);
    
    if( !empty(
$whereSyntax) )
    {
        
$whereSyntax " WHERE " .$whereSyntax;
    }
    
    if( 
strtoupper(trim($whereSyntax)) == "WHERE" )
    {
        
$whereSyntax null;
    } 


Haimz 28-01-12 10:08

כנראה שלא פתחתי את הראש עד הסוף, לא נורא זה משהו מהיר שפשוט רשמתי, ברור שהוא לא הולך להעלות אותו ככה וצריך להעביר שינויים
בקשר להגיון, זה משהו שרשמתי לפני שהוספתי את התנאי הראשון, אז שכחתי להסיר את התנאי השני -_-

dor77 28-01-12 13:09

חיים תודה על הקוד..סביר..הוא מוצא טוב רק בהנחה שאני כותב את המילה הניישה, אחרך הרביעית הוא מוצא..למשל אם יש לי:

ילד הלך לגן ביום ראשון

אם מחפשים ילד הלך זה מוצא
אם מחפשים הלך לגן זה מוצא
אבל אם מחפשים ילד ראשון זה לא מוצא..

אני חייב שהחיפוש יהיה מעולה..אחרת אני אאבד המון גולשים כי רוב הטראפיק בא מהמנוע חיפוש שבאתר.

אשמח לעזרה, תודה!

Itay 28-01-12 13:30

אם היית מסתכל על הקוד שלו היית מבין שאין מצב שזה היה מוצא משהו ב-"ילד ראשון" כי זה מחפש את 2 המילים האלו ביחד (כשהצפיפות שם היא על 2)

אבל שוב נגיד לך - MATCH AGAINST
אם אתה רוצה חיפוש שעובד כמו שצריך, לפי רלוונטיות וכו' - זה הפתרון

הנה כמה דוגמאות
http://stackoverflow.com/questions/3...r-by-relevancy
http://stackoverflow.com/questions/7...-stackoverflow
http://stackoverflow.com/questions/7...r-by-relevance
http://www.phpbuilder.com/board/show...59&postcount=4

dor77 28-01-12 14:43

ניסיתי את כולם שם,
הבעיה היא שיש לי כותרת כזו:

How to plan a trip

אם רושמים trip זה מוצא, אם רושמים plan זה מוצא, אבל אם רושמים how to זה לא מוצא.
אני יודע שיש הגבלה על חיפוש מהסוג הזה אבל בכל זאת, החיפוש הזה במצבו הנוחכי לא טוב לי.
אסור לי שהחיפוש יהיה צולע אחרת כל ההשקעה על האתר לחינם.

עריכה:

קצת מוזר אבל נראה לי שככה זה הכי טוב..השאלה האם תקני לרשום כך..:

PHP קוד:


    $query = strtolower($_GET["q"]); // <?php

include ('config.php');
    
    
$query strtolower($_GET["q"]);
    
$pieces explode(" "$query);
    
$one $pieces[0];
    @
$two $pieces[1];
    
    
$result mysql_query("
    SELECT DISTINCT `title` FROM `tutorials` WHERE title LIKE '%$one%$two%' OR title LIKE '%$two%$one%'
    "
);
    
    while(
$row mysql_fetch_array($result))
    {
        echo 
$row['title'] . "<br />\n";
    }

?>

אפשרי?

כרגע זה די טוב..אני חושב.
תודה.


כל הזמנים הם GMT +2. הזמן כעת הוא 14:16.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ