2016-04-04 4 views
1

Während complexphrase Parser in Solr mit (4.10) Ich versuche, diese Abfrage auszuführen: ((a und b) oder c) UND D.solr complexphrase Abfrage zu ignorieren und Klauseln

Die Reihenfolge ist wichtig, (A und B) oder C sollte vor D erscheinen.

Dies ist meine Abfrage - {!complexphrase inOrder=true}title:"((a AND b) OR c) d"~1000.

Das Problem ist, dass Solr das erste UND als ODER bedroht, und alle Dokumente, deren Titel ist (a OR b OR c) AND d. Was kann ich tun?

+0

Haben Sie Dokumente gesehen, die diese Art von Syntax ("UND" und "ODER" in einer komplexen Phrase) unterstützt? Ich glaube nicht, dass ich es getan habe. – femtoRgon

+1

@femtoRgon Es ist keine Dokumentation, aber ich sah dies [Blog-Post] (http://yonik.com/solr-4-8-features/) und etwas offizieller finden Sie [hier] (https: // cwiki. apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser). Der erste Satz ist _The ComplexPhraseQParser bietet Unterstützung für Wildcards, ORs usw. in Phrasenabfragen mit Lucenes ComplexPhraseQueryParser_. – ashual

Antwort

0

Ich glaube nicht, dass es Unterstützung für AND Syntax in der komplexen Phrase Abfrage Parser gibt. OR s verwenden Sie eine SpanOr. Es gibt kein Äquivalent SpanAnd in Lucene.

Auch wenn ein SpanAnd existiert, habe ich das Gefühl, es könnte etwas anderes bedeuten, als Sie erwarten. Ein OR wird verwendet, um das eine oder das andere an der gleichen Position zu entsprechen. Das heißt, (A OR B) C stimmt mit "A C" und "B C" überein. Also müsste dieser theoretische SpanAnd (A AND B) C sowohl A als auch B an der gleichen Position haben, kurz vor C. Es ist möglich, dass zwei Terme den gleichen Platz im Index belegen (mit Stemmern, Synonymfiltern usw.), aber es ist normalerweise nicht besonders interessant, um direkt zu suchen.

Um das zu erreichen, was Sie suchen, benutzen Sie mit so etwas wie gehen müssen: "a b d"~1000 "c d"~1000

Ausdruck dieser Abfrage, wie Sie es geschrieben haben, ist (grob) möglich durch die Lucene SpanQuery API:

SpanQuery abQuery = new SpanNearQuery(new SpanQuery[] { 
     new SpanTermQuery(new Term("field", "a")), 
     new SpanTermQuery(new Term("field", "b")) 
    }, 1000, true); 
SpanQuery cQuery = new SpanTermQuery(new Term("field", "c")); 
SpanQuery abcQuery = new SpanOrQuery(new SpanQuery[] { 
     abQuery, 
     cQuery 
    }); 
Query finalQuery = new SpanNearQuery(new SpanQuery[] { 
     abcQuery, 
     new SpanTermQuery(new Term("field", "d")) 
    }, 1000, true); 
TopDocs docs = searcher.search(finalQuery, 10); 

Ich glaube nicht, dass der ComplexPhrase-Parser dazu in der Lage ist. Das betrifft verschachtelte SpanNears, die der Parser meiner Meinung nach nicht unterstützt.

+0

Gibt es eine andere Möglichkeit, diese Abfrage in Lucene zu schreiben? – ashual

+0

@ashual - Nicht wirklich, nein. Surround wäre der andere wahrscheinliche Abfrageparser, den es zu testen gilt, aber auch das Verschachteln wird nicht unterstützt. – femtoRgon

Verwandte Themen