6 Stimmen

SOLR sucht nicht in bestimmten Feldern

Ich habe gerade Solr installiert, die schema.xml und versuche nun, sie zu indizieren und mit einigen Testdaten zu durchsuchen.

In der XML-Datei, die ich an Solr sende, sieht eines meiner Felder wie folgt aus:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field>

Das ist HTML, also habe ich es in CDATA verpackt.

In meinem Solr schema.xml sieht die Definition für dieses Feld wie folgt aus:

<field name="PageContent" type="text" indexed="true" stored="true"/>

Als ich das POSTing-Tool ausgeführt habe, ging alles gut, aber wenn ich nach Inhalten suche, von denen ich weiß, dass sie innerhalb der PageContent Feld, erhalte ich keine Ergebnisse.

Wenn ich jedoch die Option <defaultSearchField> Knoten zu PageContent funktioniert es. Aber wenn ich es auf ein anderes Feld setze, sucht es nicht in PageContent .

Mache ich etwas falsch? Was ist das Problem?


Um den Fehler zu klären:

Ich habe ein "Dokument" mit den folgenden Daten hochgeladen:

<field name="PageID">928</field>
<field name="PageName">some name</field>
<field name="PageContent"><![CDATA[<p>html content</p>]]></field>

In meinem Schema habe ich die Felder als solche definiert:

<field name="PageID" type="integer" indexed="true" stored="true" required="true"/>
<field name="PageName" type="text" indexed="true" stored="true"/>
<field name="PageContent" type="text" indexed="true" stored="true"/>

Und:

<uniqueKey>PageID</uniqueKey>
<defaultSearchField>PageName</defaultSearchField>

Wenn ich nun das Solr-Admin-Tool verwende und nach " some name " Ich erhalte ein Ergebnis. Aber, wenn ich nach " html content ", " html ", " content " oder " 928 ", ich erhalte keine Ergebnisse

Warum?

7voto

Trey Punkte 10770

Sie haben erwähnt, dass Ihr Standard-Suchfeld auf PageName eingestellt ist. Ich würde nicht erwarten, dass eine Suche nach "content" etwas ergibt.

Sie wollten wahrscheinlich "PageContent:content" in das Suchfeld eingeben, um Daten in diesem Feld zu finden. Wenn Sie nach mehreren Feldern suchen möchten, sollten Sie sich Folgendes ansehen http://wiki.apache.org/solr/DisMaxRequestHandler . Die Solr-Verwaltungskonsole ist kein großartiges Werkzeug, um mit all den DisMax-Suchoptionen herumzuspielen, Sie müssen dafür einfach die URL manipulieren.

Unabhängig davon stimme ich mit dem Vorposter überein, wenn Ihr Analyse-Setup nicht richtig für HTML eingerichtet ist, werden Sie wahrscheinlich alle Arten von unerwarteten Suchergebnissen erhalten. Entfernen Sie den HTML-Code und indizieren Sie nur den Text.

Wenn Sie möchten, dass Ihr Standard Query Handler alle Felder durchsucht, können Sie ihn in Ihrer solrconfig.xml ändern (ich füge immer einen zweiten Query Handler hinzu, anstatt "Standard" zu ändern). Das Feld qf ist die Liste der Felder, nach denen Sie suchen wollen. Es ist eine durch Leerzeichen getrennte Liste.

<requestHandler name="standard" class="solr.DisMaxRequestHandler">

     <lst name="defaults">
            <str name="echoParams">all</str>
            <str name="hl">true</str>

            <str name="fl">*</str>
            <str name="qf">PageName PageContent</str>
     </lst>

 </requestHandler>

1voto

Cody Caughlan Punkte 31774

Sie vergewissern sich, dass Ihre Daten festgeschrieben wurden, bevor Sie versuchen, sie zu durchsuchen, richtig?

Wenn Sie rohes HTML speichern wollen, ist es wahrscheinlich am besten, das HTML zu entfernen. Sie können dies in Ihrer Anwendung oder mit Solr's solr.HTMLStripWhitespaceTokenizerFactory tun, wie:

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

Die Sie in Ihrer Feldtyp-Definition für "text" deklarieren. Vielleicht möchten Sie einen neuen Feldtyp nur für html erstellen, vielleicht so etwas wie text_html, und Sie können ihn so verwenden:

<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100"> 
      <analyzer type="index"> 
          <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
          <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
          <filter class="solr.LowerCaseFilterFactory"/> 
          <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
      <analyzer type="query"> 
          <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
          <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
          <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
          <filter class="solr.LowerCaseFilterFactory"/> 
          <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
    </fieldtype> 

Ich bin mir nicht sicher, was Sie damit meinen:

Wenn ich den Knoten jedoch auf PageContent setze, funktioniert es. Aber wenn ich ihn auf ein anderes Feld setze, funktioniert die Suche nicht in PageContent.

Können Sie das bitte näher erläutern?

1voto

user340202 Punkte 133

fl ist die Liste der von der Abfrage zurückgegebenen Felder. qf ist die Liste, auf die Sie sich beziehen wollten, und sie unterstützt keine Platzhalter

Die einzige Möglichkeit, alle Felder zu durchsuchen, ohne sie aufzulisten, besteht darin, ein copyField zu haben, das alle Werte abfängt (nicht gespeichert, sondern nur indiziert), und dann die Suche nach allen Feldern zu imitieren, indem man nach ihnen sucht

0voto

Kurt Harriger Punkte 2427

In meiner schema.xml habe ich etwas wie das folgende, das den Wert jedes Feldes, das mit _t endet, in das Textfeld kopiert.

<defaultSearchField>text</defaultSearchField>
<copyField source="*_t" dest="text" maxChars="3000"/>

0voto

knaar Punkte 1

Der Parameter fl fait no die Felder angeben, die abgefragt werden sollen, aber die Felder, die in der Antwort zurückgegeben werden sollen.

Sie könnten einfach hinzufügen schema.xml :

<field name="fieldContainingEverything"  type="text" indexed="true" stored="true"   multiValued="true" />

 <defaultSearchField>fieldContainingEverything</defaultSearchField>

 <copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>

Bei der Indizierung wird nun jedes Feld nach fieldContainingEverything . Das Problem hier ist, dass Sie den Überblick über das Feld verlieren, aus dem der Inhalt stammt, wenn Sie diese Informationen weiter auswerten wollen. Ich würde mich freuen, wenn jemand eine Idee dazu hätte.


Ich habe eine einigermaßen funktionierende Lösung gefunden:

Um das Szenario etwas ausführlicher zu beschreiben: Ich habe eine MySQL-Datenbanktabelle mit vielen Feldern, die ich indizieren möchte, und zwar indem ich einfach jedes Feld importiere, ohne jedes Feld zu spezifizieren ( SELECT * FROM ...). Ich möchte den Index gegen jedes Feld der Tabelle abfragen und möchte wissen, welches Feld der Abfrage entspricht. Dies ist nicht ohne weiteres möglich, da der Textmarker nur anzeigt, dass das Feld, das der Abfrage entspricht, fieldContainingEverything . Durch die Verwendung dismax Abfrage-Handler habe ich festgestellt, dass er zwar in allen Feldern suchen soll, aber ich scheine ihn nicht dazu zu bringen, in Feldern zu suchen, die nicht in der qf Parameter. Die Idee ist nun, jedes Feld zusätzlich durch Hinzufügen zu indizieren:

<dynamicField name="*"  type="string"  indexed="true"  stored="true"/>

zu Ihrem schema.xml . Wenn Sie nun Solr über dismax con hl.true&hl.fl=* fügen Sie hinzu qf=fieldContainingEverything^1 zu Ihrer Parameterliste hinzufügen. Solr durchsucht nun jedes indizierte Feld, markiert aber auch jedes Feld, das den Suchbegriff enthält. Der Nachteil dieser Methode ist natürlich die erhöhte Indexgröße, die aber in den meisten Fällen nicht so relevant sein dürfte, nehme ich an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X