2010-01-21 2 views
0

Je suis en train de retourner des résultats plus comme la rechercheRails: Un bon algorithme de recherche

Mon algorithme Curren est ce

def search_conditions(column, q) 
    vars = [] 
    vars2 = [] 

    vars << q 

    if q.size > 3 
    (q.size-2).times do |i| 
     vars2 << q[i..(i+2)] 
     next if i == 0 
     vars << q[i..-1] 
     vars << q[0..(q.size-1-i)] 
     vars << q[i % 2 == 0 ? (i/2)..(q.size-(i/2)) : (i/2)..(q.size-1-(i/2))] if i > 1 
    end 
    end 

    query = "#{column} ILIKE ?" 
    vars = (vars+vars2).uniq 

    return [vars.map { query }.join(' OR ')] + vars.map { |x| "%#{x}%" } 
end 

Si je recherche « Ruby on Rails » il fera 4 recherche façons.

1) Suppression des lettres gauche "uby on Rails" .. "ils"

2) Retrait des lettres à droite "Ruby on rails" .. "Rub"

3) Suppression de gauche et à droite lettres "uby on Rails", "uby on Rail" ... "on"

4) En utilisant seulement 3 lettres "Rub", "uby", "par", "yo", "on" ... "ils"

Est-ce bon d'utiliser ces 4 façons? Il n'y en a plus? Pourquoi supprimez-vous ces lettres?

+0

Je ne suis pas exactement sûr de ce que vous essayez de faire, mais il semble que tout ce qui correspondrait à 1 - 3 serait égalé par 4. – mckeed

+0

J'essaie de trouver des mots similaires à la recherche –

+0

Similaires dans la signification ou similaire en orthographe? Si l'orthographe est vraiment tout ce qui vous intéresse, j'irais avec l'idée de distance Levenshtein que @AlexReisner mentionné. Sinon, rendez-vous avec un vrai moteur de recherche. D'une manière ou d'une autre, je ne pense pas que vous obtiendrez des résultats très favorables en coupant les lettres de début et de fin de vos termes de recherche. – pkaeding

Répondre

6

Est-ce que vous essayez de vous assurer que si quelqu'un recherche des «widgets», vous appariez également «widget»?

Si oui, ce que vous essayez de faire s'appelle 'stemming', et c'est vraiment beaucoup plus compliqué que de supprimer les lettres de début et de fin. Supprimer 'stop words' de votre requête. Ce sont ces mots extrêmement communs qui sont nécessaires pour former des phrases grammaticalement correctes, mais qui ne sont pas très utiles pour la recherche, tels que 'a', 'the', etc.

Obtenir le droit de recherche est un problème immensément complexe et difficile . Je suggère que vous n'essayez pas de le résoudre vous-même, et que vous vous concentriez plutôt sur l'objectif principal de votre site. Peut-être que vous pouvez tirer parti de la fonctionnalité de recherche du projet Lucene dans votre code. Ce lien peut également être utile pour using Lucene in Ruby on Rails.

J'espère que cela aide; Je me rends compte que j'ai un peu déformé votre question initiale, mais je ne recommanderais vraiment pas d'essayer d'y remédier vous-même.

+0

C'est ce que nous appelons de bons conseils. – jonnii

+0

solr semble vraiment bon, je pense que je vais l'utiliser. :) –

+1

Cool, je suis content que ça a aidé! – pkaeding

2

Comme le dit le pkaeding, le bourrage est beaucoup trop compliqué pour essayer de vous implémenter. Toutefois, si vous souhaitez rechercher des chaînes similaires (pas exactes) dans MySQL, et que vos termes de recherche d'utilisateur sont très proches de la valeur complète d'un champ de base de données (par exemple, vous ne recherchez pas un grand nombre de mots). phrase), vous pouvez essayer d'utiliser le Levenshtein distance. Voici un MySQL implementation. L'algorithme de Levenshtein vous permettra de faire des correspondances "floues", vous donnera un score de similarité, et vous aidera à éviter l'installation et la configuration d'un démon de recherche, ce qui est compliqué. Cependant, ceci est vraiment seulement pour un cas très spécifique, pas une recherche générale de site.

+0

C'est une bonne idée, si cela correspond à vos besoins. Je mettrai ce lien en signet :) – pkaeding

+0

Cet algorithme semble intéressant, mais je pense que cela ne marcherait pas pour mon cas. Quoi qu'il en soit, mis en signet. –

1

Alors, étaient tous suggérant d'autres solutions possibles, consultez:

Sphinx - Comment mettre en œuvre la recherche de texte intégral pour que 10+ millions table de ligne, gardez avec la charge, et rester pertinent? Sphinx est bon pour ces sortes d'énigmes.

Thinking Sphinx - Un connecteur Ruby entre Sphinx et ActiveRecord.

+0

mais sphinx va chercher des mots similaires? –