2016-05-17 8 views
0

Ich verwende Solr 5.2.1 (Einfache eigenständige Instanz auf dev PC) und Ausführen von Solrj in einer Spring-Anwendung.Solr TextField zu Java @Field Mapping

Ich habe alles gut funktioniert (Solrj Client ist in der Lage, das Domain-Modell mit @Field Annotationen kommentiert und abzurufen), aber ich wollte Freitextsuche auf einem der Domain-Modell-Felder verwenden, so änderte ich seinen Typ von String zu einem Textfeld, mein Verständnis ist dies ermöglicht einen mehr freien Text Ansatz für die Suche statt Schlüssel: Wert Paartyp sucht wo solr geben alles oder nichts zurück.

schema.xml Snippet

<field name="description" type="text_general" indexed="true" stored="true"/> 

Java Bean-Schnipsel

public String getDescription() { 
    return description; 
} 

@Field 
public void setDescription(String description) { 
    this.description = description; 
} 

Die Save-Seite hat gut funktioniert, ich bin in der Lage SOLR vai die Java Bean ans solrj zu aktualisieren und mit Hilfe der http-Client Ich kann sehen, dass die Daten hineingehen, das Problem, das ich habe, ist, dass ich die Java-Bean nicht zurückbekommen kann, wenn ich sie abfrage. Solr mag den String-basierten Setter nicht, wenn er versucht, die Bean zu füllen. Ich erhalte die folgende Fehlermeldung:

Caused by: org.apache.solr.client.solrj.beans.BindingException: Exception while setting value : [PetShop] on public void search.CompanySummarySolr.setDescription(java.lang.String) 

INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder$DocField.set(DocumentObjectBinder.java:447) 

INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder$DocField.inject(DocumentObjectBinder.java:430) 

INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder.getBean(DocumentObjectBinder.java:64) 

INFO [stdout] (http-localhost-127.0.0.1-8080-6) ... 64 more 

INFO [stdout] (http-localhost-127.0.0.1-8080-6) Caused by: java.lang.IllegalArgumentException: argument type mismatch 

ich den Fehler verstehen, ich kann einfach nicht herausfinden, wie man würde das Textfeld abzubilden. Im HTTP-Client sieht die Json-Ausgabe wie ein Array aus, aber in der Solr-API http://lucene.apache.org/solr/5_2_0/solr-core/org/apache/solr/schema/TextField.html erweitert sie Object nicht um ein Array.

Alle kann ich sehen, ist I Äther tun müssen das Feld haben als

@Field 
public void setDescription(Object description) { 
    this.description = (???) description; 
} 

In diesem Fall, wie kann ich es wieder in einen String bekommen?

Oder ich kann die org.apache.solr.schema.TextField

@Field 
public void setDescription(TextField description) { 
    this.description = description.getValueSource(???, ???); 
} 

verwenden Aber ich auch nicht wirklich verstehen, wie den String wieder aus für den Anfang zu bekommen, und zweitens sieht es aus wie ich um die gesamte Solr-Bibliothek in das Projekt einzubinden, da sich das TextField-Objekt nicht in der Solrj-Bibliothek befindet.

Ich bin sicher, dass ich etwas verpasst habe, alle anderen Felder so einfach zuordnen, aber ich finde kein Beispiel, wie man die Beschreibung zurück zum Client als String bekommt und auch eine Freitextsuche in diesem Feld erlaubt Strings erlauben diese Art der Suche nicht, soweit ich das verstehe.

Jede Hilfe dankbar gerne

Antwort

0

So würde es Solr defaults TextField- zu einem Mehrwert-Feld erscheinen. Dies bedeutet, dass Solr das String-Feld, das ich übergeben habe, mit einem Array umschließt, was dazu führt, dass der Bean-Setter bricht, da Solr ein Array mit 1 String anstelle eines String zurückgeben möchte.

Um dies zu beheben, bearbeiten Sie einfach Ihr Schema.XML-Datei und explizit Solr text_general sagen ist ein Einzelwert, so in meinem Fall das Beschreibungsfeld

Daraus ging:

<field name="description" type="text_general" indexed="true" stored="true"/> 

zu diesem:

<field name="description" type="text_general" indexed="true" stored="true" multiValued="false"/> 

Jetzt Solr konvertiert glücklicherweise meine Antwort in seine Komponente Java-Bean.