Library für Textsuche (z. B. include/exclude, and/or)?

webracer999

Mitglied
Ich habe eine JavaFX-Anwendung mit einem TableView. Der Anwender kann die angezeigten Zeilen über eine Sucheingabe (TextField) filtern.

Bisher gehe ich über alle Zellen und verwende einfach String.contains().
Ich würde das nun gerne erweitern, dass z. B. auch sowas wie "hello OR hallo -world columnB:abc". eingegeben werden kann.
-> include oder exclude ("-world"), AND-/OR-Verknüpfungen, Suche in bestimmten Spalten ("columnB:abc") etc.

Kennt hier jemand eine bestehende Bibliothek für diesen Anwendungsfall?
Ich habe bereits im Internet recherchiert, aber nichts gefunden. Apache Lucene, Apache Solr, Elasticsearch gehen für den Anwendungsfall zu weit, soweit ich das bisher verstanden habe. Meine Daten sind ja sehr strukturiert (eben in Tabellenform) und kein Volltext.
 
Eine Lib kenne ich nicht, aber so etwas lässt sich mit durchaus vertretbarem Aufwand selbst schreiben. Der Hauptaufwand besteht darin, die formale Sprache zu spezifizieren, die in der Suche verwendet wird.
 
Nachdem ich das Programm nur selber nutze, kann ich es in der Tat relativ simpel halten. Mir persönlich reicht erst mal ein Ausschluss ("-world") und die Suche in Spalten ("columnB:abc"). Das lässt sich wirklich noch relativ leicht implementieren.

Wo es schon anspruchsvoller wird, wenn man mit Wortketten arbeitet (z. B. "hallo welt") oder mit Klammern für AND/OR.
Ich hab mal einen einfachen Rechnungsformel-Löser erstellt, der Strings wie "-23 * 3 (21 - 3 + 4)" lösen konnte. Würde in dem Fall wohl in eine ähnliche Richtung gehen. Also erst die Tokens ermitteln, daraus einen Ablaufbaum erstellen und diesen dann lösen.

Bin jetzt noch auf Parsergeneratoren gestoßen, z. B. ANTLR (https://www.antlr.org/). Werd ich mir mal anschauen, ob da die Einarbeitung die Mühe wert ist. 🙂
 
Ja, ANTLR ist natürlich eine Möglichkeit, um einen Syntaxbaum zu erzeugen, das ist aber auch nur ein Werkzeug, das Dir die Definition der Sprache zwar vereinfacht aber nicht abnimmt.

Soweit ich das sehe, hast Du nur ein paar Lexeme: Identifier, String, den Doppelpunkt als Operator für den Spaltenzugriff, ansonsten "and", "or" und das "-" für "not", Klammern könnte man noch hinzufügen.

Ob Du dafür ANTLR bemühen möchtest, musst Du selbst wissen.
 
In der Definition der Sprache sehe ich keine allzu große Herausforderung. Da gibt es genügend Praxisbeispiel und praktisch Best Practices.

Und ja, den Syntaxbaum kann man auch selbst erstellen oder eben einen Parsergenerator verwenden.
Für mich war damals bei dem Rechnungsformel-Löser die große Erkenntnis, dass man das am besten in zwei großen Schritten macht: erst mal die Tokens ermitteln und daraus den Ablaufbaum erstellen und diesen dann im zweiten Schritt lösen.

Ich war ja ursprünglich auf der Suche nach einer fertigen Library. Aber ich glaub, obwohl eine Suchfunktion ja oft benötigt wird, ist es doch recht anwendungsspezifisch und man muss sich das wohl selbst bauen.
 
Das denke ich auch, zumal es ja dann darauf ankommt, den Syntaxtree zu verarbeiten. Vermutlich baust Du den Syntaxtree in einen Objektbaum um, der sich dann um die "Ausführung" kümmert und dürfte dann auch der Punkt sein, der dann doch sehr spezifisch wird (JDBC/JPA bzw. SQL/SQL-Dialekte/JPQL, ...)
 

Zurück
Oben