2017-12-26 4 views
0

Lassen Sie mich versuchen, mein Problem zu erklären, nehmen wir an, ich habe ein mehrwertiges Feld namens "Einschreibung" in jedem Dokument, das den Namen der Schüler enthält.Solr - sortiere Ergebnisse nach maximalen Übereinstimmungen für ODER-Suche im mehrwertigen Feld

Nun suche ich auf der Suche nach Solr nach den Namen von drei Studenten - Manish, Amit, Navin. Jetzt gibt Solr alle Dokumente zurück, die einen dieser Namen enthalten (was in meinem Fall offensichtlich erwünscht ist). Jetzt können einige Dokumente alle 3 davon haben, oder 2 von ihnen oder 1 von ihnen. Ich möchte, dass diese Dokumente/Ergebnisse in einer Reihenfolge sortiert werden, in der das Dokument mit der maximalen Übereinstimmung ganz oben steht, gefolgt von einer geringeren Anzahl an Übereinstimmungen.

Ich habe versucht, sort: score desc für diese, aber es funktioniert nicht wie gewünscht, da die Punktzahl ist "1" für alle übereinstimmenden Dokumente.

Wie kann ich die Sortierreihenfolge nach der maximalen Anzahl von Übereinstimmungen für mein mehrwertiges Feld erreichen?

+0

Wie sieht Ihre Anfrage aus? – MatsLindh

+0

Tatsächliche ist auf Rollennummern, aber das ist, wie es in dem gegebenen Beispiel wäre - 'curl http: // localhost: 8983/solr/XYZ/Abfrage-d '{" Abfrage ":" Einschreibung: Amit Manish Navin "," sort ":" score desc "} ' – Manish

+0

Das ist wirklich wichtig, da der Score nicht für ganze Zahlen berechnet wird; Wenn Sie ein Token-Textfeld wie in Ihrer Frage haben, sind die Score-Berechnungen unterschiedlich. Es gibt auch keinen'Abfrage'-Parameter, der an Solr gegeben wird (die reguläre Abfrage wird durch 'q' gegeben). Wenn Sie eine Frage stellen, ist es wichtig, dass die Frage die gleiche ist wie das, was Sie zu lösen versuchen. Sie können Ihr tatsächliches Problem wahrscheinlich lösen, indem Sie für jeden Wert, den Sie suchen, Boost-Abfragen geben (also 'bq = Feld: Wert & bq = Feld: Wert2'). – MatsLindh

Antwort

1

Bei einem mehrwertigen Ganzzahlfeld, in dem Sie die Dokumente basierend auf der Anzahl der Übereinstimmungen ranken möchten, wenden Sie eine Anhebungsabfrage für jede Übereinstimmung an. Wenn Sie zum Beispiel eine Reihe von Monitoren in verschiedenen Größen haben, können Sie für jede gültige Größe einen Boost anwenden (ich habe das zusammengehackt und es mit den Beispieldokumenten aus dem Tech-Core getestet, das ist also mein Beispiel und ich Ich bleibe dabei. Ich habe zwei relevante Dokumente, eines mit dem Namen VA902B mit sizes als ein mehrwertiges Feld mit den Werten 23, 28 und 32, und eines mit dem Namen 3007WFP mit den Werten 23, 29, 36 im selben Feld.

Hier frage ich für jedes Dokument, aber geben Sie mir diejenigen, die sowohl Größe 28 und Größe haben 23 an der Spitze, und dann diejenigen, die entweder eine Größe von 28 oder Größe haben 23, und dann jedes andere Dokument:

?bq=sizes:28&bq=sizes:23&defType=edismax&q=*:* 

Wenn ich den Satz von Dokumenten auf diejenigen beschränken möchten, die eine der beiden Größen übereinstimmen, kann ich das als meine Hauptabfrage:

?defType=edismax&q=sizes:(23%2028) 

.. und das ist, wo ich, dass Ihre Vermutung entdecken dass die Punktzahl unabhängig von der Anzahl der Übereinstimmungen gleich ist, ist falsch. Hinzufügen &debugQuery=true an die URL gibt uns detaillierte Scoring-Informationen für jedes Dokument:

"explain": { 
    "VA902B": "\n2.0 = sum of:\n 1.0 = sizes:[23 TO 23]\n 1.0 = sizes:[28 TO 28]\n", 
    "3007WFP": "\n1.0 = sum of:\n 1.0 = sizes:[23 TO 23]\n" 
},  

.. was bedeutet, dass es keine Notwendigkeit, einen Schub für die Anwendung - das Verhalten, das Sie wollen, ist das Standard Verhalten für Solr. Das war mein erster Gedanke, aber das hätte dir die richtige Antwort mit den Fragen gegeben, die du in den Kommentaren gegeben hast.

Aber ich werde Sie zeigen, wie meine Strategie steigert mit der Anwendung als auch hätten gearbeitet:

?bq=sizes:28&bq=sizes:23&defType=edismax&q=sizes:(23%2028)&debugQuery=true 

.. was sagt uns jetzt, dass die Punktzahl für jedes Dokument effektiv verdoppelt hat, da es 1,0 erzielt wird (aus der Abfrage) + 1,0 (aus dem Boost) für jedes Spiel.

"explain": { 
    "VA902B": "\n4.0 = sum of:\n 2.0 = sum of:\n 1.0 = sizes:[23 TO 23]\n 1.0 = sizes:[28 TO 28]\n 1.0 = sizes:[28 TO 28]\n 1.0 = sizes:[23 TO 23]\n", 
    "3007WFP": "\n2.0 = sum of:\n 1.0 = sum of:\n 1.0 = sizes:[23 TO 23]\n 1.0 = sizes:[23 TO 23]\n" 
}, 

Getestet habe ich auch die q=sizes(23 28) Abfrage mit dem Standard lucene Abfrageparser (und nicht dismax/edismax die bq unterstützen), und das Verhalten war das gleiche.

+0

Interessant! Ich werde meine Ergebnisse überprüfen und Ihnen meine Ergebnisse bald geben. – Manish

+0

Das ist, was ich bekomme, wenn ich suche mit 'fl = score, doc_id' -> ' [{"score": 1.0, "doc_id": "2173763"}, {"score": 1.0, "doc_id ":" 1016369 "}, {" score ": 1.0," doc_id ":" 1852970 "}, ....]' – Manish

+0

Aber der interessante Teil ist, was debugQuery für Ihre Dokumente anzeigt, was der _exact_ Query String an Solr gesendet hat (Sie können die Protokollierung unter dem Admin-Panel erhöhen, damit Solr Ihnen anzeigt, dass alle Abfragen bearbeitet werden) und was die Felddefinition für das Feld ist, das Sie suchen. – MatsLindh

Verwandte Themen