2010-12-23 8 views
1

Ich frage mich, ob das Folgende mit FTS (3/4) für SQLite möglich ist. Ich habe eine Tabelle mit einigen Daten mit FTS3 erstellt.SQLite Volltextsuche Katalog

Wenn ich zum Beispiel nach e * i suche, bekomme ich alles, was mit^e beginnt Aber kann ich auch den Index/Katalog nach bestimmten Wörtern suchen, die mit e beginnen?

So dass ich nur die Ergebnisse dieser Wörter zurück wie bekommen; Elliot, Elo, Euhh.

Antwort

2

http://www.sqlite.org/fts3.html#section_3

 SELECT * FROM docs WHERE docs MATCH 'lin*'; 

Wird die Dokumentation zurück, die ein Wort beginnend mit "lin" enthalten. Sie wollen nur die passenden Wörter, nicht den Kontext? Vielleicht hilft dir die "Schnipsel" -Funktion. Und Sie können dieses Thema von Interesse:

http://www.mail-archive.com/[email protected]/msg49345.html

+0

Dies wird eine Reihe von Zeilen zurückgeben, die lin * enthalten, aber was ich erreichen möchte, ist, Wörter zurückgeben, die sind indexiert von sqlite. Also zum Beispiel sollte es in Ihrem Beispiel Linux, linear, linwhatever zurückgeben ... aber nicht die Zeilen, die Lin enthalten * – Grezly

+0

Wir tippen zur gleichen Zeit. Siehe angehängte Info. – Tim

+0

Snippets sind, was ich gesucht habe.SQL gibt an, welche Wörter sich mit der Eingabe vergleichen. Die einzigen Dinge, die übrig bleiben, sind die Wörter zu extrahieren, so dass wir nur das/die exakte (n) Wort (e) sehen. – Grezly

2

Der FTS-Engine sieht vor, dass Informationen über die offsets virtuelle Funktion.

SELECT offsets(docs) FROM docs WHERE docs MATCH 'e*'; 

Wie die Dokumentation sagt:

Für eine SELECT-Abfrage, die den Volltextindex verwendet, die Offsets() Funktion eine Reihe von Leerzeichen getrennte Zahlen enthält einen Textwert zurückgibt. Für jeden Ausdruck in jeder Übereinstimmung der aktuellen Zeile gibt es vier Ganzzahlen in der zurückgegebenen Liste. Jeder Satz von vier ganzen Zahlen wird wie folgt interpretiert:

  1. Die Spaltennummer, die der Begriff Beispiel tritt in (0 für die am weitesten links liegenden Spalte der FTS Tabelle 1 für die nächste am weitesten links usw.).
  2. Der Begriff Nummer des übereinstimmenden Begriffs innerhalb des Volltext-Abfrageausdrucks. Begriffe innerhalb eines Abfrageausdrucks werden beginnend mit 0 in der Reihenfolge ihres Auftretens nummeriert.
  3. Der Byte-Offset des übereinstimmenden Terms innerhalb der Spalte.
  4. Die Größe des übereinstimmenden Begriffs in Bytes.

wie diese Informationen zu extrahieren, ist bis zu Ihnen und wie Sie Ihren Code mit SQLite integrieren.

0

Die documentation of the snippet function ist in Bezug auf ihren 6. Parameter ziemlich vage, da der Algorithmus einen Best-Score-Ansatz verwendet, um das Snippet zu finden.

Trotzdem in meiner Anwendung bekomme ich einen sauberen Extrakt aus den ursprünglichen Bedingungen mich mit der Bitte suchen:

select snippet(docs,'','','', -1, 1) from docs where docs match 'e*'; 

Es ist in Ihrem Fall helfen kann; Diese In-Database-Lösung hat mir geholfen, weil ich die Begriffe in Code außerhalb der Datenbank nicht extrahieren wollte. Es funktioniert, wenn Sie nach einzelnen Wörtern suchen (kein Leerzeichen, ODER, .. in der MATCH-Abfrage)