Search API Solr

am 02.12.2014 - 16:08 Uhr in
Hi Forum,
ich versuche gerade mich in das Search API Solr Modul einzuarbeiten, leider finde ich eine wichtige Stelle nicht, wo baut Drupal die Request-URL zusammen?
Hintergrund der Frage ist, wenn ich nach '*' suche bekomme ich keine Ergebnisse angezeigt, wenn ich aber http://localhost:8080/solr/collection1/select?q=*%3A*&wt=json&indent=true oder http://localhost:8080/solr/collection1/select?q=*&wt=json&indent=true bekomme ich alle meine Ergebnisse. Sollte es eine Stelle geben an der das Konfigurierbar ist, nur her damit, doch mehr interessiert mich der Code an dem die URL zusammengebaut wird (bzw. der Post) - auch um später eher was nachvollziehen zu können.
mfg
Tim
- Anmelden oder Registrieren um Kommentare zu schreiben
Hallo Tim, die SOLR Search
am 03.12.2014 - 11:57 Uhr
Hallo Tim,
die SOLR Search API indexiert nodes und Ihre Felder in den SOLR Index durch Cron läufe.
Es gibt In der SOLR Search API Einstellungen welche Felder wie indexiert werden sollen.
Wenn ein Benutzer eine Suche auslöst, läuft es umgekehrt.
Die Search API guckt welche nodes Felder gesucht werden und erstellt den Search String für den Index.
Die SOLR Search API weiss wie die nodes/felder im index heissen.
So heisst ggf: node 31 im index index_31 und node 31 body feld ist ggf im index ss_article_body
Der HttpRequest wird vom Browser ausgeführt, Du solltest den im Firebug sehen können.
Ich denke Du lernst mehr, wenn Du Dir das Schema des SOLR Indexes sowie die SOLR Query Syntax genauer ansiehst.
http://www.solrtutorial.com/solr-query-syntax.html
Wenn Du spezielle Suchen hast, mache erst die Suche von Hand.
Hast Du das gewünschte Ergebnis, kannst Du versuchen den Query durch Sucheinstellungen hin zu bekommen,
da Du ja weisst, wie dieser aussehen müsste.
Schönen Advent
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Hi Robert, vielen Dank für
am 03.12.2014 - 12:33 Uhr
Hi Robert,
vielen Dank für den Link. Das Prinzip von Solr ist mir durchaus bewusst, ich kann ab und an jedoch noch nicht nachvollziehen, wie das Modul alles umsetzt. Fireburg und Crome sagen mir leider nicht, wie die URL heißt die abgesetzt wird, aber hier https://www.drupal.org/node/2240049 steht die Information die mir erstmal fehlte. Wenn ich nach Sternchen "*" suche, wird dieses leider zu einem "". Wenn ich jetzt das "" einfach durch sternchen * ersetzte erhalte ich auch den erwarteten Response.
mit bestem Gruß
Tim
www.geoportal.de
Hallo Tim,sorry ich habe Dir
am 03.12.2014 - 12:58 Uhr
Hallo Tim,
sorry ich habe Dir da etwas falsches gesagt.
Den Request zum Solr macht Drupal nicht der Browser,
daher kannst Ihn in Firebug gar nicht sehen.
Mit deinem obigen Link kannst Du dir den Request ausgeben lassen.
In dem Link den ich Dir gesendet habe schau mal bei Wildcard Matching.
Dort steht das SOLR * als ersten Charakter einer Suche nicht akzeptiert.
Note that Lucene doesn't support using a * symbol as the first character of a search.
LG
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Hi Robert,ich glaube in
am 03.12.2014 - 16:59 Uhr
Hi Robert,
ich glaube in diesem Fall ist es ein Drupal-Problem, welches recht simnpel gelöst werden kann, ich brauche nur die Stelle an der das Sternchen feilter wird. In der Datei solr_connection.inc des search_api_solr Moduls wird in der Funktion public function search($query = NULL, array $params = array(), $method = 'GET') die URL zusammengebaut. Und wenn ich mit Sternchen suche (siehe unten), dann kommt diese bereits nicht als query an, alles andere wird sofert als query ausgegeben und auch in einen query-Parameter umgewandelt, nur eben bei einem * nicht. Wenn ich die URL hier manuell eingebe
z.B.
http://127.0.0.1:8080/solr/collection1/select?fl=item_id%2Cscore&qf=tm_field_md_abstract%5E1.0&qf=tm_field_md_alternatetitle%5E1.0&qf=tm_field_md_cataloguuid%5E1.0&qf=tm_field_md_creationdate%5E1.0&qf=tm_field_md_geoid%5E1.0&qf=tm_field_md_keywords%5E1.0&qf=tm_field_md_language%5E1.0&qf=tm_field_md_provider%5E1.0&qf=tm_field_md_resolution%5E1.0&qf=tm_field_md_resstand%5E1.0&qf=tm_field_md_revision%5E1.0&qf=tm_field_md_time%5E1.0&qf=tm_field_md_uuid%5E1.0&qf=tm_title%5E1.0&fq=index_id%3A%22advmis%22&fq=hash%3A8fl2gm&start=0&rows=10&facet=true&facet.sort=count&facet.limit=10&facet.mincount=1&facet.missing=false&facet.field=ss_field_md_level&f.ss_field_md_level.facet.limit=50&wt=json&json.nl=map&q=*
Für mich bedeutet das erstmal, dass ich die Stelle finden muss wo dieses Query aus der URL(vermute ich) abgeleitet wird.
Dann funktioniert die Anforderung prima, sprich, wenn ich den Punkt finde an dem das Sternchen gefiltert wird, dann kann ich den Bug bereinigen, denn Lucene steckt zwar im Solr, aber Solr kann mit dem * sehr gut umgehen-kann über die normale Adminoberfläche von Solr auch sehr gut nachvollzogen werden.
mfg
Tim
public function search($query = NULL, array $params = array(), $method = 'GET') {
// Always use JSON. See
// http://code.google.com/p/solr-php-client/issues/detail?id=6#c1 for
// reasoning.
$params['wt'] = 'json';
// Additional default params.
$params += array(
'json.nl' => self::NAMED_LIST_FORMAT,
);
dpm('Real Query: ');
dpm($query); //Außer Sternchen kommt hier eigentlich alles an
dpm($params);
if (isset($query)) {
$params['q'] = $query;
}
// Carry out some performance improvements when no search keys are given.
if (!isset($params['q']) || !strlen($params['q'])) {
// Without search keys, the qf parameter is useless. We also remove empty
// search keys here. (With our normal service class, empty keys won't be
// set, but another module using this connection class might do that.)
unset($params['q'], $params['qf']);
// If we have filters set (which will nearly always be the case, since we
// have to filter by index), move them to the q.alt parameter where
// possible.
if (!empty($params['fq'])) {
$qalt = array();
foreach ($params['fq'] as $i => $fq) {
// Tagged filters cannot be moved to q.alt.
if ($fq[0] !== '{') {
$qalt[] = "($fq)";
unset($params['fq'][$i]);
}
}
if ($qalt) {
$params['q.alt'] = implode(' ', $qalt);
}
if (empty($params['fq'])) {
unset($params['fq']);
}
}
}
// Build the HTTP query string. We have our own method for that since PHP's
// built-in http_build_query() doesn't give us the format Solr wants.
dpm('Parameter: ');
dpm($params);
$queryString = $this->httpBuildQuery($params);
dpm('Querystring: ');
dpm($queryString);
if ($method == 'GET' || $method == 'AUTO') {
$searchUrl = $this->constructUrl(self::SEARCH_SERVLET, array(), $queryString);
if ($method == 'GET' || strlen($searchUrl) <= variable_get('search_api_solr_http_get_max_length', 4000)) {
return $this->sendRawGet($searchUrl);
}
}
// Method is POST, or AUTO with a long query
$searchUrl = $this->constructUrl(self::SEARCH_SERVLET);
$options['data'] = $queryString;
$options['headers']['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
return $this->sendRawPost($searchUrl, $options);
}
www.geoportal.de
Hallo nochmal,also ich halte
am 03.12.2014 - 19:44 Uhr
Hallo nochmal,
also ich halte es für keine gute Idee ein Contrib Modul selbst zu patchen.
Die Änderungen werden bei einem Update des Moduls überschreiben.
Liefert Dir der query manuell Ergebnisse oder nicht (das konnte ich aus Deinem vorigen Post nicht herauslesen)?
http://127.0.0.1:8080/solr/collection1/select?fl=item_id%2Cscore&qf=tm_field_md_abstract%5E1.0&qf=tm_field_md_alternatetitle%5E1.0&qf=tm_field_md_cataloguuid%5E1.0&qf=tm_field_md_creationdate%5E1.0&qf=tm_field_md_geoid%5E1.0&qf=tm_field_md_keywords%5E1.0&qf=tm_field_md_language%5E1.0&qf=tm_field_md_provider%5E1.0&qf=tm_field_md_resolution%5E1.0&qf=tm_field_md_resstand%5E1.0&qf=tm_field_md_revision%5E1.0&qf=tm_field_md_time%5E1.0&qf=tm_field_md_uuid%5E1.0&qf=tm_title%5E1.0&fq=index_id%3A%22advmis%22&fq=hash%3A8fl2gm&start=0&rows=10&facet=true&facet.sort=count&facet.limit=10&facet.mincount=1&facet.missing=false&facet.field=ss_field_md_level&f.ss_field_md_level.facet.limit=50&wt=json&json.nl=map&q=*
Leider weiss ich nicht welche SOLR Version Du benutzt aber mir scheint der q Parameter falsch
Ich kannte den Parameter Doppelpunkt mit q=*:*
Ausserdem musst Du aufpassen wenn du q und fq mischt, denn q bekommt nur was der fq durchlässt.
http://stackoverflow.com/questions/24319955/in-apache-solr-is-it-possibl...
LG
Robert
PS:
Wie der Wildcard und q genutzt werden kann in der SOLR Konfiguration eingestellt werden.
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Hi Robert,ich weiß leider
am 04.12.2014 - 11:22 Uhr
Hi Robert,
ich weiß leider das es keine gute Idee ist, ein Modul so zu patchen, ich denke ich mache das erstmal auch nur bis ich das Modul gänzlich verstanden habe. Der Request
http://127.0.0.1:8080/solr/collection1/select?fl=item_id%2Cscore&qf=tm_field_md_abstract%5E1.0&qf=tm_field_md_alternatetitle%5E1.0&qf=tm_field_md_cataloguuid%5E1.0&qf=tm_field_md_creationdate%5E1.0&qf=tm_field_md_geoid%5E1.0&qf=tm_field_md_keywords%5E1.0&qf=tm_field_md_language%5E1.0&qf=tm_field_md_provider%5E1.0&qf=tm_field_md_resolution%5E1.0&qf=tm_field_md_resstand%5E1.0&qf=tm_field_md_revision%5E1.0&qf=tm_field_md_time%5E1.0&qf=tm_field_md_uuid%5E1.0&qf=tm_title%5E1.0&fq=index_id%3A%22advmis%22&fq=hash%3A8fl2gm&start=0&rows=10&facet=true&facet.sort=count&facet.limit=10&facet.mincount=1&facet.missing=false&facet.field=ss_field_md_level&f.ss_field_md_level.facet.limit=50&wt=json&json.nl=map&q=*
liefert exakt die Ergebnisse die ich haben möchte. Nur ein Sternchen kommt eben erst gar nicht bei der URL an. Ich hatte bis dato gedacht, dass das Modul dieses * rausfiltert. Ich schau mir den FQ einmal an.
mfg
Tim
Ich benutze übrigens 4.6.1, wobei meines Erachtens seit der Version 4 q=* immer funktioniert hat, um alle Datensätze zu bekommen. Wenn ich in Drupal mit *:* suche, wird der Query leider auch nicht ausgeführt, weil an Solr q=: geschickt wird.
www.geoportal.de
Hallo nochmal, es ist schon
am 04.12.2014 - 11:36 Uhr
Hallo nochmal,
es ist schon eine Weile her als ich zuletzt einen SOLR verwendet habe.
Also wenn der Query die richtigen Ergebnisse liefert ist er wohl definitiv richtig.
Anstatt das Modul umzuschreiben, würde ich eher den q parameter
vom SOLR anhängen lassen.
Du kannst in den SOLR Einstellungen des RequestHandlers (heute SearchHandler) QueryParameter hinzu fügen.
http://wiki.apache.org/solr/SearchHandler
Das sollte für Dich besser Funktionieren.
LG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Hi Robert, damit werde ich es
am 04.12.2014 - 12:02 Uhr
Hi Robert, damit werde ich es vermutlich machen müssen, da hast du vollkommen recht, hätte ich auch dran denken können. Nichts deso trotz werde ich nicht drum herumkommen mir das Modul genauer anzusehen. Und da ist eben erstmal das Ziel zu schauen an welcher Stelle der Search API der Query gefiltert wird. Ich werde mich wohl auch in die Entwicklerliste mit eintragen lassen und da mitwirken, da ich eh nicht um das Solr-Modul herumkomme.
mit freundlichem Gruß
Tim
www.geoportal.de