2017-02-23 2 views
0

Ich muss eine boolesche Abfrage mit ANDs, ORs und NOTs nur in ANDs und NOTs umwandeln. Alle meine ORs müssen in ANDs konvertiert werden, wobei natürlich die ursprüngliche Bedeutung beibehalten wird.Lucene: boolesche Abfragen mit ORs nur in ANDs umwandeln

Zum Beispiel:

a AND b AND (c OR d OR e) 

Sollte auf mehrere getrennte Anfragen umgewandelt werden:

a AND b AND c 
a AND b AND d 
a AND b AND e 

, die die gleiche logische Ergebnis ist, aber es ist nicht OPs verwendet wird. Ich habe viele verschiedene Ansätze ausprobiert, aber noch keine echte Lösung. Ich weiß, dass ich vielleicht De Morgans Gesetze gebrauchen könnte, aber ich habe noch keine Lösung gefunden.

Es ist wichtig zu beachten, dass ich jede Art von Abfrage konvertieren muss, nicht nur die in meinem Beispiel. Ich muss wirklich alles abdecken. Als weitere Beispiele (comma eine weitere Abfrage Bedeutung):

a OR b > a, b 
a AND (b OR c) > a AND b, a AND c 
a OR (b AND (c OR d)) > a, b AND c, b AND d 
... 

Dank!

EDIT: klare Beispiele:

lucene AND (solr OR hadoop) > lucene AND solr, lucene AND hadoop 
stackoverflow AND (java OR lucene) -solr > stackoverflow AND java -solr, stackoverflow AND lucene -solr 

Antwort

1

Klingt so, als müssten Sie den Suchausdruck in disjunctive normal form konvertieren. Dann kann jeder Begriff der Disjunktion als eine getrennte Suche verwendet werden und die Suchergebnisse können kombiniert werden.

Probieren Sie googlen "konvertieren in disjunktive Normalform" für Prozesse und Beispiele.

0

Jedes Mal, wenn Sie ein

begegnen
E = a OR b 

dann können Sie zu einem UND-NOTs

E = NOT NOT E 
E = NOT NOT (a OR b) 
E = NOT (NOT a AND NOT b) 

So ODER-Verknüpfung konvertieren Sie‘ Ein Beispiel würde wie folgt konvertiert werden:

E = a AND b AND (c OR d OR e) 
E = a AND b AND NOT NOT (c OR d OR e) 
E = a AND b AND NOT (NOT c AND NOT d AND NOT e) 
+0

In einer booleschen Logik würde es funktionieren, aber in meiner tatsächlichen Verwendung, die Boolesche Suche ist, würde es nicht funktionieren. Ich muss zum Beispiel nach einem AND (b OR c) auf Facebook suchen, und es wird nur ANDs akzeptieren, also ist "NOT a" keine Suchanfrage. In einem realen Beispiel, die Abfrage "Lucene AND (Solr OR hadoop)", konnte ich nicht nach "-lucene" und so weiter suchen, verstanden? – Ivan

+0

oh ich sehe, ich habs – mduf

Verwandte Themen