2016-09-21 1 views
1

In Rails gebe ich eine Zeichenfolge: "AE18BX21". Ich frage die Datenbank nach Zeichenfolgen, die mit der Eingabezeichenfolge übereinstimmen. Die Eingabezeichenfolge und die Zeichenfolge in der Datenbank stimmen jedoch manchmal nicht überein. Manchmal gibt es einen zusätzlichen Buchstaben/eine Nummer, manchmal fehlt ein Buchstabe/eine Nummer, oder manchmal ist der Buchstabe/die Nummer ein anderer Buchstabe/eine andere Nummer.Wie Zeichenfolge mit einer anderen Zeichenfolge übereinstimmt, die fast identisch ist (Fuzzy-Matching)

Ich habe ein paar verschiedene Regex Ausdrücke versucht, wie:

Table.where("string =~ ?", 'A+E+1+8+B+X+2+1') 

Table.where("string =~ ?", '(A|.)+(E|.)+(1|.)+(8|.)+(B|.)+(X|.)+(2|.)+(1|.)') 

In einer idealen Welt würde ich wollen, dass es nur die Saiten zurückzuversetzen 80% oder mehr zusammenpassen.

+0

Ich glaube, Sie suchen nach etwas, wie Levenshtein-Distanz, aber nicht sicher, welche db-Engine Sie verwenden und ob sie dies unterstützt. In Bezug auf Ihre erste Regex könnten Sie versuchen: 'Table.where (" string = ~? "," A * E * 1 * 8 * B * X * 2 * 1 * ') ' –

+0

Ja, ich hatte nicht darüber nachgedacht die Levenshtein-Entfernung. Ich benutze PostgresSQL. Ich werde einchecken. – cal1801

Antwort

0

Nach dem Lesen Ihrer Frage, ich denke, Sie wollen etwas wie Levenshtein Abstand, und wie Sie in Ihrem Kommentar, für Postgres könnten Sie es verwenden.

Zitiert seine Dokumentation hier: https://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html

test=# SELECT levenshtein('GUMBO', 'GAMBOL'); 
levenshtein 
------------- 
      2 
(1 row) 

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1); 
levenshtein 
------------- 
      3 
(1 row) 

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2); 
levenshtein_less_equal 
------------------------ 
         3 
(1 row) 

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4); 
levenshtein_less_equal 
------------------------ 
         4 
(1 row) 

Dann können Sie Ihre SQL-Abfrage mit Ihrem Wunsch Entfernung bauen:

SELECT * 
FROM YourTable 
WHERE levenshtein(string , 'AE18BX21') <= 2 
+0

Danke für den Link. Hat viel geholfen. Ich werde die Fuzzystrmatch in Postgres installieren und das wird fantastisch! – cal1801

Verwandte Themen