2014-12-19 5 views
8

Ich habe bereits integrated search based on the official Android documentation und Ich verwende die folgenden SQLite-Schema und Abfrage:Wie implementiert man Fuzzy-Suche mit SQLite FTS3?

CREATE VIRTUAL TABLE Search USING FTS3 (
    _id, 
    name, 
    location 
); 

select * from Search where name MATCH ? 
-- where ? is the user typed exact "query" 
-- or if it doesn't have spaces or stars I append a star to search prefix: "query*" 

Ich frage mich, wie kann ich es verlängern?Folgendes zu ermöglichen:

sagen, dass ich einige Elemente mit dem Namen:

  • My Fancy Artikel
  • My Secret Artikel
  • Artikel # 1
  • Ihre Fancy Artikel

Wenn der Benutzer gibt blah in das Suchfeld ein, das die Suchergebnisse anzeigen würden:

  • my
    • Mein Fancy Artikel
    • Mein Geheimnis Artikel
  • mfi
    • M y F ancy I tem
  • fan item, fanit, fit
    • Mein Fan cy Es em
    • Ihre Fan cy Es em
  • it, item, im, itm
    • My Fancy I te m
    • My Secret I te m
    • I te m # 1
    • Ihre Fancy I tem

Die Ergebnisse sollten basierend auf eingestuft werden, wie gut das Spiel ist, wenn beispielsweise die Buchstaben weiter sind weg sollten sie niedriger als eine exakte Übereinstimmung, wie für mfi: "My Fancy Item" sollte den letzten Rang und "MFI-Dings" sollte den ersten Rang (wenn es einen solchen Artikel).

Hinweis: Mein min SDK ist API-Ebene 10, die means it has to work SQLite 3.6.22.

Eine ähnliche Funktionalität kann meist in IDEs finden:

+0

Es gibt keine Möglichkeit, die unscharfe Suche zu implementieren. Ihre Anforderungen sind viel zu vage, um eine richtige Antwort zu finden. – wvdz

+1

'* l * i * k * e * t * h * i * s *' aber ich mache mir Sorgen über die Effizienz dieser Lösung – Selvin

+0

@popovitsj Benutzer gibt alles und wenn es mit einem Teil des Namens übereinstimmt zeigt es die Ergebnis. – TWiStErRob

Antwort

3

SQLite des FTS erlaubt nur ganze Wörter oder für Wortpräfixe.

Es gibt keine integrierte Funktionalität für unscharfe Suchen wie diese. (. Und die Android-Datenbank-API erlaubt es nicht, Sie benutzerdefinierte virtuelle Tabelle Implementierungen hinzufügen)

+1

Irgendeine Idee für Alternativen? – TWiStErRob

1

Ich ging meine Kriterien mit entspannender alle Wortanfängen suchen:

private static String fixQuery(String query) { 
    return query.trim().replaceAll("\\s+", "*") + "*"; 
} 

es ziemlich gut funktioniert. Nicht typo-resistent, aber es fühlt sich natürlich an, wenn ich es benutze.

+0

Können Sie etwas erklären, was das bedeutet? – theGreenCabbage

+0

@theGreenCabbage "suche alle Wortanfänge", '\\ s +' Regex bedeutet "jeder zusammenhängende Leerraum" so wird "ab cd ef" zu "ab * cd * ef *" und [siehe die Dokumentation was '*' bedeutet] (https://sqlite.org/fts3.html#termprefix) – TWiStErRob

+0

Danke. Ich denke, das ist es, was ein Artikel einer Python-implementierten unscharfen Suche tut. Ich benutze Laravel und finde, dass ich dafür einfach Scope-Abfragen verwenden kann. Wenn das nicht funktioniert, komme ich zu Ihrer Lösung zurück. Danke. – theGreenCabbage

Verwandte Themen