Volltextsuche mit Literalen

Please report bugs here!

Moderator: Thorsten

Post Reply
ufo
Posts: 5
Joined: Fri Oct 21, 2005 11:43 am

Volltextsuche mit Literalen

Post by ufo »

Hallo

Habe einiges versucht und die Ergebnisse sind nicht so ermutigend.
Meine Umgebung:
MySQL 4.1.11 (phpMyAdmin 2.6.1-pl3)
PHPMyFAQ 1.5.3

Direkt auf der DB ausgeführt (MyAdmin) ergibt das hier:

Code: Select all

SELECT * FROM `faqdata` 
WHERE match (keywords, thema, content)
against ( ' "stop limit" '  in boolean mode)
2 Hits

In MyFAQ Search:

Code: Select all

stop limit
17 Hits

Code: Select all

+stop +limit 
5 Hits

Code: Select all

'stop limit'
17 Hits

Code: Select all

"stop limit"
kein Hit, Keyword verschlukt

Code: Select all

' "stop limit" '
kein Hit, Keyword:
<input class="inputfield" type="text" name="suchbegriff" size="50" value="' "stop limit" '" />


Nicht genau das was wir suchen. Richtig wäre 2 Hits. Ich vermute mal die Quotas erreichen MySQL gar nicht :?:
Ich weiss, dass die Quoten immer ein Problem sind, aber gemäss MySQL-Handbuch braucht es sie nun mal um Literale zu suchen :?

Gruss
Urs
Thorsten
Posts: 15741
Joined: Tue Sep 25, 2001 11:14 am
Location: #phpmyfaq
Contact:

Post by Thorsten »

Hi,

du kannst mal in der inc/init.php den DEBUG Mode auf true setzen, dann siehst du die Queries am Ende der Seite.

Eigentlich sollten die schon korrekt ankommen.

bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
ufo
Posts: 5
Joined: Fri Oct 21, 2005 11:43 am

Post by ufo »

OK, werde mal schauen. Grundsätzlich löst das hier das Problem:

Code: Select all

>  $against = "('".str_replace(" ", "* ", trim($string))."*' IN BOOLEAN MODE)"; // Search with MySQL 4.0.1+
---
<  $against = "('$string' IN BOOLEAN MODE)"; // Search with MySQL 4.0.1+
Das gibt dir die volle Kontrolle über die MATCH() Funktion (inklusive '*, (), " etc.'.
... aber das ist vermutlich nicht in deinem Sinn. :)

Urs
Thorsten
Posts: 15741
Joined: Tue Sep 25, 2001 11:14 am
Location: #phpmyfaq
Contact:

Post by Thorsten »

Hi,

da ist nur die Frage, warum ich dass mal so programmiert habe... :?:

bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
ufo
Posts: 5
Joined: Fri Oct 21, 2005 11:43 am

Post by ufo »

Code: Select all

DEBUG INFORMATION:
SELECT id, lang, parent_id, name, description FROM faqcategories WHERE lang = 'en' ORDER BY id
SELECT DISTINCT faqdata.id AS id, faqdata.lang AS lang, faqdata.thema AS thema, faqcategoryrelations.category_id AS category_id, faqvisits.visits AS visits FROM faqvisits, faqdata LEFT JOIN faqcategoryrelations ON faqdata.id = faqcategoryrelations.record_id AND faqdata.lang = faqcategoryrelations.record_lang WHERE faqdata.lang = 'en' AND faqdata.id = faqvisits.id AND faqdata.lang = faqvisits.lang AND faqdata.active = 'yes' ORDER BY faqvisits.visits DESC
SELECT DISTINCT faqdata.id AS id, faqdata.lang AS lang, faqcategoryrelations.category_id AS category_id, faqdata.thema AS thema, faqdata.datum AS datum, faqvisits.visits AS visits FROM faqvisits, faqdata LEFT JOIN faqcategoryrelations ON faqdata.id = faqcategoryrelations.record_id AND faqdata.lang = faqcategoryrelations.record_lang WHERE faqdata.lang = 'en' AND faqdata.id = faqvisits.id AND faqdata.lang = faqvisits.lang AND faqdata.active = 'yes' ORDER BY faqdata.datum DESC
Also debug bringt nicht die Query, die wir suchen.
da ist nur die Frage, warum ich dass mal so programmiert habe... :?:
Ist das Dein Ernst? War leider nicht dabei :D Ich nehme an das hat mit Security zu tun, oder es löste ein Problem in einer älteren MySQL-Version :?:

Urs
Thorsten
Posts: 15741
Joined: Tue Sep 25, 2001 11:14 am
Location: #phpmyfaq
Contact:

Post by Thorsten »

Hi,

okay... seltsamerweise wird die Query nur ausgegeben, wenn man sie per print Funktion in der Methode db_mysql::search() am Ende ausgibt...

Da sollte es aber passen.

bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
ufo
Posts: 5
Joined: Fri Oct 21, 2005 11:43 am

Post by ufo »

Code: Select all

SELECT faqdata.id AS id, faqdata.lang AS lang, faqcategoryrelations.category_id AS category_id, faqdata.thema AS thema, faqdata.content AS content FROM faqdata LEFT JOIN faqcategoryrelations ON faqdata.id = faqcategoryrelations.record_id AND faqdata.lang = faqcategoryrelations.record_lang WHERE MATCH (faqdata.thema,faqdata.content,faqdata.keywords) AGAINST ('\"stop* limit\"*' IN BOOLEAN MODE) AND (faqdata.active = 'yes') 
Die Asteriks sind hier das Problem. Sie verändern den String innerhalb der Quotas, was einen 'literal'-match verunmöglicht.

Eigentlich braucht es die Sterne nicht, denn match() sucht schon selber nach Wortteilen.
Die Saubere Version (wie weiter oben gepostet):

Code: Select all

SELECT faqdata.id AS id, faqdata.lang AS lang, faqcategoryrelations.category_id AS category_id, faqdata.thema AS thema, faqdata.content AS content FROM faqdata LEFT JOIN faqcategoryrelations ON faqdata.id = faqcategoryrelations.record_id AND faqdata.lang = faqcategoryrelations.record_lang WHERE MATCH (faqdata.thema,faqdata.content,faqdata.keywords) AGAINST ('\"stop limit\"' IN BOOLEAN MODE) AND (faqdata.active = 'yes')
Ich fahre mal mit der Version ohne 'replace' und 'trim'. Mal sehen was die Benutzer finden...

By
Urs
Thorsten
Posts: 15741
Joined: Tue Sep 25, 2001 11:14 am
Location: #phpmyfaq
Contact:

Post by Thorsten »

Hi,

so, ich habe auch ein wenig getestet und habe str_replace() und das doppelte trim() rausgenommen. Ist auch schon im CVS eingecheckt und wird somit morgen im stabilen Snapshot sein.

Danke für deine Hilfe.

bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
Post Reply