php mysql zoek fulltext

Tafel structuur:

Companies: id, name, city, branch, keywords, country

Het trefwoordenveld bevat de naam stad en gemeente samen, ik gebruik nu gewoon een LIKE met wildcards, bijvoorbeeld '% music london%' retourneert 'musicfactory london'

But it is not precise enough for example if the user wants to search Vini & Magraine in London (a restaurant) and the input was 'vini londen' it was not found, however if the user inserts 'magraine london' it will get found.

Dus het probleem is waarschijnlijk de volgorde waarin de sleutelwoorden zijn, nu ben ik van plan om naar een fulltext-zoekopdracht te converteren, ik heb de index in het sleutelwoordveld gemaakt, is ook het sleutelwoordveld een slim idee?

Mijn belangrijkste vraag is, ik heb een fulltext-zoekopdracht gemaakt met deze query:

SELECT id, name, branch FROM companies WHERE MATCH(keywords) AGAINST(? IN BOOLEAN MODE) AND country = ? LIMIT 7

Maar het levert niet de juiste resultaten op? Wat is de beste en vooral werkende oplossing?

Bedankt voor het lezen.

0

1 antwoord

Dit is een goede opsplitsing van de standaard match tegen operators. Het zou duidelijk moeten maken HOE je vraag te schrijven:

http://dev.mysql.com/doc/refman/5.5 /en/fulltext-boolean.html

Als ik je vraag goed lees, vraag je of een kolom "keywords" in de tabel met bedrijven een goed idee is - ik zeg dat het afhangt van hoe je het invult, maar het is zeker niet slecht. Ik heb een verzamelnaamkolom gebruikt die alle standaardtekst uit de verzameling relevante velden bevatte en het is goed gelukt.

Een paar andere opmerkingen -

1) Ik denk dat jouw LIKE-voorbeeld gebrekkig is en volgens die regel ben ik verrast dat je resultaten hebt. % is een wildcard die directioneel is. dus '% music london%' mag 'musicfactory london' NIET retourneren. je zou dat moeten schrijven als WHERE ( keywords LIKE '% music%' AND keywords LIKE '% london%') om dat te laten werken.

2) zoekopdrachten met volledige tekst kunnen alleen in MyISAM-tabellen worden gebruikt, dus als u een framework gebruikt dat afhankelijk is van innoDB, moet u een relationele workaround maken. (of een andere reden waarom u innoDB zou gebruiken)

3) match tegen heeft standaard een minimum aantal karakters van 4 ini-instellingen. U moet dat lager in uw config instellen en vervolgens uw volledige tekstindexen opnieuw opbouwen als u een lager min-tekenbereik nodig hebt. Overweeg woorden als 'kunst' en u weet waarom wordt voorgesteld deze waarde te verlagen. Anders moet u mogelijk een voorwaarde schrijven om tussen match tegen en LIKE-modus te schakelen voor kortere strings.

1
toegevoegd
Kun je dubbel controleren wat je hier zei: je database IS innoDB? Als dat het geval is, werkt u niet tegen en moet u een tijdelijke oplossing overwegen. Kun je het verifiëren? Daarnaast kunt u een queryreeks maken op basis van een set operators die u zelf definieert. met behulp van regex kun je eenvoudig bepaalde dingen in je zoekterm identificeren, zoals bijvoorbeeld citaten, of komma's, enz. Gebruik die dan om te beslissen of je (+, - enz.) nodig hebt om je overeenkomst met de term te wijzigen.
toegevoegd de auteur Kai Qing, de bron