FULLTEXT поиск подстроки - возможно?

Discussion in 'PHP' started by Apeckou, 6 Jan 2012.

  1. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    Кто шарит, подскажите плз, возможно ли, юзая FULLTEXT, искать ПОДСТРОКИ а не только целые слова?


    PHP:
    mysqlselect from TEST;
    +--------------------+---------------+------------------------+
    a                  b             c                      |
    +--------------------+---------------+------------------------+
    kartinka88.jpg     image/jpeg    cool girl              |
    moja programma.exe exe/something IDPBrute v.0.1         |
    manson.mp3         mp3 file      krutaja pesnya Mansona |
    +--------------------+---------------+------------------------+
    3 rows in set (0.00 sec)

    mysqlselect from TEST where match(a,b,cagainst('moja');
    +--------------------+---------------+----------------+
    a                  b             c              |
    +--------------------+---------------+----------------+
    moja programma.exe exe/something IDPBrute v.0.1 |
    +--------------------+---------------+----------------+
    1 row in set (0.00 sec)


    mysqlselect from TEST where match(a,b,cagainst('jpg');
    Empty 
    set (0.04 sec)
    Как видите, поиск по "jpg" ничего не дал, т.к. во-первых, это подстрока, во-вторых, это слово меньше трех букв, в-третьих, фуллтекст еще и умничает, думая что это общеупотребимое слово (часто встречается в строках).
    Ну не пиздец? Придется обратно на LIKE переходить...?

    Если это невозможно, то плз подскажите как лучше реализовать поиск по ключевым словам, при том что их может быть несколько (кол-ва не знаю), пока что я извратился, дописывая mysql запрос в цикле:

    PHP:
    $string1="SELECT COUNT(*) FROM $infotable WHERE LOWER(fname) LIKE '%$word%' OR LOWER(ftext) LIKE '%$word%'";

    foreach(
    $words as $word)                         {
    $string1.=" OR LOWER(fname) LIKE '%$word%' OR LOWER(ftext) LIKE '%$word%'";

                                        }
    $string1.=" ORDER BY fid DESC LIMIT $from,$step";
    такой вариант "удовлетворителен" но не нравится т.к. запрос может получиться длинный, и еще потому что это MYSQL а не MYSQLI, пример запроса на MYSQLI:

    PHP:
    $word='%test%';

    $link=mysqli_connect('localhost',"$baselogin","$basepass","$database");
    $stmt=$link->prepare("SELECT COUNT(*) FROM $infotable WHERE LOWER(fname) LIKE '?' OR LOWER(ftext) LIKE '?');
    $stmt->bind_param("ss",$word,$word);
    $stmt->execute();
    $stmt->close();
    $link->close();
     
    #1 Apeckou, 6 Jan 2012
    Last edited: 6 Jan 2012
  2. red_joker

    red_joker New Member

    Joined:
    4 Nov 2010
    Messages:
    31
    Likes Received:
    3
    Reputations:
    0
    Могу посоветовать копать в сторону Sphinx - придется немного погеморроиться при установке, настройке индексов итд - но его быстродействие и эффективность окупят все усилия с лихвой. Поддерживает поиск со * (включая части слова и подстроки) и еще кучу опций. Sphinx работает намного быстрее мускульного поиска по FULLTEXT индексу - особенно заметно на больших нагрузках.
     
  3. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    делай через like и не е* голову