2016-07-28 9 views
1

Ich möchte Folgendes tun: Sei A die Menge der Dokumente, jedes mit dem wichtigen Feld: true, und mit einem Datum beginnend mit diesem Jahr oder dem Vorjahr. Das Ergebnis sollte nach Datum sortiert werden. In Pseudo-Code:Kann ich Resultsets in Solr kombinieren

Ergebnis gesetzt A:

q="testquery" +important:true AND +(date:2015* OR date:2016*) 
sort=date desc 

Dann lassen Sie B die verbleibende Menge von Dokumenten, dh diejenigen mit wichtigem: true und einem Datum vorangegangenen Jahr 2015 und auch alle Dokumente mit wichtig: falsch. Dieses Set sollte auch nach Datum sortiert werden. Wieder in sehr schlampig pseudo:

Ergebnis Satz B:

q="testquery" -(date:2015* OR date:2016*) 
sort=date desc 

Nun würde Ich mag A gefolgt von B zurückzukehren, und usw., um die Paging-Funktionen nutzen zu können, ich mit SOLR sehr Noob bin (< 10 Stunden des Ausprobierens verschiedener Abfragen) und ich kann mir nicht vorstellen, wie man dieses Verhalten erreicht. Ich denke, ich kann bq nicht benutzen, da wir nicht nach Partitur sortieren, oder?

Ein Beispiel für das gewünschte Ergebnis:

<result name="response" numFound="2089" start="0"> 
    <doc> 
     <bool name="important">true</bool> 
     <str name="date">2016-03-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">true</bool> 
     <str name="date">2015-12-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">true</bool> 
     <str name="date">2015-04-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">true</bool> 
     <str name="date">2015-01-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">false</bool> 
     <str name="date">2016-10-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">false</bool> 
     <str name="date">2015-03-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">false</bool> 
     <str name="date">2014-02-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">true</bool> 
     <str name="date">2014-09-01 00:00:00</str> 
    </doc> 
    <doc> 
     <bool name="important">false</bool> 
     <str name="date">2013-05-01 00:00:00</str> 
    </doc> 
    <doc> 

    <str name="date">2012-09-01 00:00:00</str> 
    </doc> 
    </result> 
</response> 

Hinweis in dem obigen Beispiel, dass für Dokumente älter als 2015, die Dokumente wichtig ist nicht wichtiger als jeder andere markiert, werden sie in streng chronologischer Reihenfolge erscheinen.

Jede Hilfe ist geschätzt, aber ich würde vor allem die Liebe Beispielen SolrNet Syntax :)

EDIT: ich zu indizieren oder Schema ...

+0

Warum haben Sie wichtig: falsch, Datum: [2015,2016] in Ihren Dokumenten? Scheint, als ob sie nicht in entweder A oder B sein sollten? false 2016-10-01 00:00:00 false 2015-03-01 00:00:00

+0

@Alexandre Rafalovitch. Vielleicht war ich nicht klar, set B ist die Menge aller Dokumente, die der Abfrage entsprechen, die nicht bereits in Menge A erscheint, nach Datum gesucht. Set A sind alle Dokumente aus dem Jahr 2015, in denen das wichtige Flag gesetzt ist, sortiert nach Datum. Vielleicht habe ich Ihre Frage falsch verstanden. – mickey

+0

Gibt es einen Grund, warum Sie diese Client-Seite nicht tun würden? – Mico

Antwort

2

((important: true AND (date:2016* OR date:2015*))^1001 OR (important: false AND (date:2016* OR date:2015*))^1000 OR date:*) AND something:"foo" und Art score desc, date desc keine Änderungen vornehmen können

Dies wird zuerst wichtige Elemente zuerst, dann zuletzt nicht wichtige Elemente und schließlich alle Elemente und alles nach Datum sortiert in ihren "Abschnitten" zeigen.

something:"foo" am Ende der Klausel bezieht sich auf alle zusätzlichen Klauseln, die Sie haben könnten.

+0

Nach Datum sortieren macht alle Erhöhungen rückgängig, die Sie hinzufügen, um die Abschnitte zu verschieben. Diese sind nur nützlich, wenn Sie nach Punkten sortieren. –

+0

Ah ja, vergessen zu erwähnen. Verwenden Sie die Sortierung "Score desc, date desc" – Mico

1

Die größte Herausforderung hier - ich fühle - ist die Sortierung nach Datum. Ohne dies könnten Sie Ihre Spezialprivilegabfrage leicht an die Spitze bringen. Aber nach dem Datum nach dem Sortieren sortiert würde dies zurücksetzen und Sie wären wieder da, wo Sie angefangen haben.

Es ist jedoch möglich, sort by several fields. Wenn also Ihre spezielle Bedingung während der Indexierung als Feldwert codiert werden könnte, könnten Sie zuerst nach diesem und dann nach dem Datum sortieren.

Wenn dies während der Indizierung nicht möglich ist, müssen Sie möglicherweise einen zweiten Trick hinzufügen. Es ist möglich, sort by a function query anstelle eines Feldes. Sie müssten also einen Funktionsabfrageausdruck erstellen (wahrscheinlich unter Verwendung von , wenn und mindestens), die Ihren Boost-Zustand darstellt.

Möglicherweise haben Sie einige Herausforderungen, die Ihre 2015/2016 als Bedingung darstellen. Wenn es sich um ein Datum handelt, können Sie möglicherweise date math verwenden, um eine konsistente Abrundung auf ein Jahr (NOW/YEAR) zu erstellen.

Ich würde beginnen, indem Sie ein einfacheres Problem der nur schieben wichtige Element an die Spitze, noch nach Datum sortiert. Nur um zu testen, dass meine Logik hier funktioniert. Wenn/einmal das mit Funktionen und Sortieren und Paging funktioniert, können die speziellen Daten in die Berechnung aufgenommen werden.

+0

Vielen Dank! Ich kann die Daten nicht ändern, und ich denke, das Datum wird nicht als Datumsobjekt gespeichert, sondern als String (JJJJ-MM-TT 00:00:00). Ich hatte kein Problem damit, alles Wichtige an die Spitze zu bringen und dann das Wichtige und Unwichtige einzeln nach Datum zu sortieren. Ich habe bereits eine Antwort angenommen, die gestern funktioniert hat und Boosting verwendet hat, aber ich würde wirklich gerne etwas mit Function Query arbeiten, für Lernzwecke, wenn nicht anders – mickey

Verwandte Themen