Die Solr -Plugins von DICE.com zur Durchführung einer personalisierten Suche und Empfehlungen (über das Relevancy Feedback -Plugin) und die konzeptionelle / semantische Suche (über das unbeaufsichtigte Feedback -Plugin).
Eine vorgefertigte JAR-Datei finden Sie im Ordner ./target . Das Projekt enthält eine Maven pom.xml -Datei, mit der sie auch aus der Quelle erstellt werden können.
Wenn es eine bestimmte Version von Solr gibt, für die Sie dies benötigen, erstellen Sie bitte ein Github -Problem und ich werde sehen, was ich tun kann. Um es für eine bestimmte Version manuell zu kompilieren, verwenden Sie Maven, um die Plugins mithilfe der Datei pom.xml zu kompilieren und die Versionen der Solr- und Lucene -Bibliotheken in dieser Datei zu aktualisieren und verwenden Sie mit Maven diese Abhängigkeiten. Beheben Sie dann alle Kompilierungsfehler.
Bitte beachten Sie die offiziellen Solr -Richtlinien für die Registrierung von Plugins mit Solr. Damit werden die JAR -Datei im Grunde einfach in einen der Ordner fallen, die Solr auf Klassen- und JAR -Dateien auf dem Core -Reload überprüfen.
Eine Beispielanforderungs -Handler -Konfiguration für die Solrconfig.xml ist unten angezeigt, wobei Kommentare die Hauptparameter beschreiben:
<requestHandler name="/rf" class="org.dice.solrenhancements.relevancyfeedback.RelevancyFeedbackHandler">
<lst name="defaults">
<str name="omitHeader">true</str>
<str name="wt">json</str>
<str name="indent">true</str>
<!-- Regular query configuration - query parser used when parsing the rf query-->
<str name="defType">lucene</str>
<!-- fields returned -->
<str name="fl">jobTitle,skill,company</str>
<!-- fields to match on-->
<str name="rf.fl">skillFromSkill,extractTitles</str>
<!-- field weights. Note that term weights are normalized so that each field is weighted exactly in this ratio
as different fields can get different numbers of matching terms-->
<str name="rf.qf">skillFromSkill^3 extractTitles^4.5</str>
<int name="rows">10</int>
<!-- How many terms to extract per field (max) -->
<int name="rf.maxflqt">10</int>
<bool name="rf.boost">true</bool>
<!-- normalize the weights for terms in each field (custom to dice rf, not present in solr MLT) -->
<bool name="rf.normflboosts">true</bool>
<!-- Take the raw term frequencies (false) or log of the term frequenies (true) -->
<bool name="rf.logtf">true</bool>
<!-- Minimum should match settings for the rf query - determines what proportion of the terms have to match -->
<!-- See Solr edismax mm parameter for specifics -->
<bool name="rf.mm">25%</bool>
<!-- Returns the top k terms (see regular solr MLT handler) -->
<str name="rf.interestingTerms">details</str>
<!-- Turns the rf query into a boost query using a multiplicative boost, allowing for boosting -->
<str name="rf.boostfn"></str>
<!-- q parameter - If you want to execute one query, and use the rf query to boost the results (e.g. for personalizing search),
pass the user's query into this parameter. Can take regular query syntax e.g.rf.q={!edismax df=title qf=.... v=$qq}&qq=Java
The regular q parameter is reserved for the rf query (see abpve)
-->
<str name="q"></str>
<!-- Query parser to use for the q query, if passed -->
<str name="defType"></str>
<!-- rf.q parameter - Note that the regular q parameter is used only for personalized search scenarios, where you have a main query
and you want to use the rf query generated to boost the main queries documents. Typically the rf.q query is a query that identifies
one or more documents, e.g. rf.q=(id:686867 id:98928980 id:999923). But it cam be any query. Note that it will process ALL documents
matched by the q query (as it's intended mainly for looking up docs by id), so use cautiously.
-->
<str name="rf.q"></str>
<!-- query parser to use for the rf.q query -->
<str name="rf.defType"></str>
<!-- Settings for personalized search - use the regular parameter names for the query parser defined by defType parameter -->
<str name="df">title</str>
<str name="qf"> company_text^0.01 title^12 skill^4 description^0.3</str>
<str name="pf2">company_text^0.01 title^12 skill^4 description^0.6</str>
<!-- Content based recommendations settings (post a document to the endpoint in a POST request). The stream.body and stream.head are form parameters
You can send them in a GET request, but a POST handles larger data. If you have really large documents, you will need to change the buffer settings
so that the request doesn't blow the buffer limits in Solr or your web server.
-->
<!-- Fields used for processing documents posted to the stream.body and stream.head parameters in a POST call -->
<str name="stream.head.fl">title,title_syn</str>
<str name="stream.body.fl">extractSkills,extractTitles</str>
<!-- pass a url in this parameter for Solr to download the webpage, and process the Html using the fields configured in the stream.qf parameters -->
<str name="stream.url"></str>
<!-- Note that we have two different content stream fields to pass over in the POST request. This allows different analyzers to be appkied to each.
For instance, we pass the job title into the stream.head field and parse out job titles, while we pass the job description to the stream.head parameter
to parse out skills -->
<!-- Pass the document body in this parameter as a form parameter. Analysed using the stream.body.fl fields-->
<str name="stream.body"></str>
<!-- Pass the second document field in this parameter. Analysed using the stream.head.fl fields-->
<str name="stream.head"></str>
<!-- Specifies a separate set of field weights to apply when procesing a document posted to the request handler via the
stream.body and stream.head parameters -->
<str name="stream.qf">extractSkills^4.5 extractTitles^2.25 title^3.0 title_syn^3.0</str>
</lst>
</requestHandler>
http: // localhost: 8983/solr/jobs/rf? 34667D61FADCDCABFD359CF4 & ROWS = 10 & DF = Titel & FL = Titel, Fähigkeiten, Geocode, City, State & Wt = JSON
{
"match":{
"numFound":2,
"start":0,
"docs":[
{
"id":"a2fd2f2e34667d61fadcdcabfd359cf4",
"title":"Console AAA Sports Video Game Programmer.",
"skills":["Sports Game Experience a plus.",
"2-10 years plus Console AAA Video Game Programming Experience"],
"geocode":"38.124447,-122.55051",
"city":"Novato",
"state":"CA"
},
{
"id":"11f407d319d6cc707437fad874a097c0",
"title":"Game Engineer - Creative and Flexible Work Environment!",
"skills":["3D Math",
"Unity3d",
"C#",
"3D Math - game programming",
"game programming",
"C++",
"Java"],
"geocode":"33.97331,-118.243614",
"city":"Los Angeles",
"state":"CA"
}
]
},
"response":{
"numFound":5333,
"start":0,
"docs":[
{
"title":"Software Design Engineer 3 (Game Developer)",
"skills":["C#",
"C++",
"Unity"],
"geocode":"47.683647,-122.12183",
"city":"Redmond",
"state":"WA"
},
{
"title":"Game Server Engineer - MMO Mobile Gaming Start-Up!",
"skills":["AWS",
"Node.JS",
"pubnub",
"Websockets",
"pubnub - Node.JS",
"Vagrant",
"Linux",
"Git",
"MongoDB",
"Jenkins",
"Docker"],
"geocode":"37.777115,-122.41733",
"city":"San Francisco",
"state":"CA"
},...
]
}
}
Eine Beispielanforderungs -Handler -Konfiguration für die Solrconfig.xml ist unten angezeigt, wobei Kommentare die Hauptparameter beschreiben:
<requestHandler name="/ufselect" class="org.dice.solrenhancements.unsupervisedfeedback.UnsupervisedFeedbackHandler">
<lst name="defaults">
<str name="omitHeader">true</str>
<str name="wt">json</str>
<str name="indent">true</str>
<!-- Regular query configuration -->
<str name="defType">edismax</str>
<str name="df">title</str>
<str name="qf">title^1.5 skills^1.25 description^1.1</str>
<str name="pf2">title^3.0 skills^2.5 description^1.5</str>
<str name="mm">1</str>
<str name="q.op">OR</str>
<str name="fl">jobTitle,skills,company</str>
<int name="rows">30</int>
<!-- Unsupervised Feedback (Blind Feedback) query configuration-->
<str name="uf.fl">skillsFromskills,titleFromJobTitle</str>
<!-- How many docs to extract the top terms from -->
<str name="uf.maxdocs">50</str>
<!-- How many terms to extract per field (max) -->
<int name="uf.maxflqt">10</int>
<bool name="uf.boost">true</bool>
<!-- Relative per-field boosts on the extracted terms (similar to edismax qf parameter -->
<!-- NOTE: with uf.normflboosts=true, all terms are normalized so that the total importance of each
field on the query is the same, then these relative boosts are applied per field-->
<str name="uf.qf">skillsFromskills^4.5 titleFromJobTitle^6.0</str>
<!-- Returns the top k terms (see regular solr MLT handler) -->
<str name="uf.interestingTerms">details</str>
<!-- unit-length norm all term boosts within a field (recommended) - see talk for details -->
<bool name="uf.normflboosts">true</bool>
<!-- use raw term clounts or log term counts? -->
<bool name="uf.logtf">false</bool>
</lst>
</requestHandler>
http: // localhost: 8983/solr/dicejobscp/ufelect? FL = Titel, Fähigkeiten, Geocode, Stadt, State & fq = {! GeoFilt+Sfield = JobendecageoCode+D = 48+Pt = 39,6955, -105.0841} & wt = json
{
"match":
{
"numFound":7729,
"start":0,
"docs":[
{
"title":"NLP/Machine Learning Engineer",
"skills":["Linux",
"NLP (Natural Language Processing)",
"SQL",
"Bash",
"Python",
"ML (Machine Learning)",
"JavaScript",
"Java"],
"geocode":"42.35819,-71.050674",
"city":"Boston",
"state":"MA"
},
{
"title":"Machine Learning Engineer",
"skills":["machine learning",
"java",
"scala"],
"geocode":"47.60473,-122.32594",
"city":"Seattle",
"state":"WA"
},
{
"title":"Machine Learning Engineer - REMOTE!",
"skills":["Neo4j",
"Hadoop",
"gensim",
"gensim - C++",
"Java",
"R",
"MongoDB",
"elastic search",
"sci-kit learn",
"Python",
"C++"],
"geocode":"37.777115,-122.41733",
"city":"San Francisco",
"state":"CA"
},...
]
}
Während es locker auf dem Solr MLT -Handlercode und dem Algorithmus basiert (was nur der Rocchio -Algorithmus ist), gibt es einige wichtige Unterschiede im Algorithmus -Design. Der MLT -Handler übernimmt beim Bau der MLT -Abfrage die obersten K -Begriffe über alle konfigurierten Felder. Wenn Sie ein Feld haben, das ein breiteres Vokabular als die anderen Felder aufweist, ist die durchschnittliche Dokumenthäufigkeit eines Terms niedriger als in anderen Feldern mit kleineren Vokabeln. Dies bedeutet, dass diese Begriffe hohe relative IDF -Werte aufweisen und die vom Solr MLT -Handler ausgewählten Topbegriffe dominieren. Unser Anfrage -Handler nimmt die obersten K -Begriffe pro Feld. Es wird auch sichergestellt, dass das Feld, unabhängig von der Anzahl der viele Begriffe pro Feld (bis zur konfigurierten Grenze), in der resultierenden Abfrage die gleiche Gewichtung aufweist wie alle anderen Felder, bevor die im Parameter RF.QF angegebenen Feldspezifikationen angewendet werden. Dies ist das zweite Problem mit dem Solr MLT -Handler, den wir angehen. Wir bieten auch viel zusätzliche Funktionalität. Wir ermöglichen die Übergabe von Inhaltsströmen, die mit mehreren Dokumenten (eher wie "diese" als "this") übereinstimmen, und wenden Sie den Boost -Abfrage -Parser auf die resultierende MLT -Abfrage an, um einen beliebigen Solr -Boost anzuwenden (multiplikativ). Und wir unterstützen den MM -Parameter, damit wir Dokumente erzwingen können, zurückzukommen, die nur mit % der Top -Begriffe übereinstimmen.
Wenn Sie dies verwenden möchten, um die Suchpersonalisierung durchzuführen, wie in meinem Talk von Lucene Revolution 2017 gezeigt, müssen Sie die aktuelle Suchabfrage des Benutzers mit dem regulären Q -Parameter ersterben, und die Informationen, die zur Generierung der Rocchio -Abfrage verwendet werden, werden über den Parameter RF.Q -Parameter von RF.Q übergeben. Beachten Sie jedoch, dass die auf die Begriffe in der Rocchio -Abfrage angewendeten Boosts für die in Ihrer Benutzerabfrage nicht zu vergleichenden Gewichten sind, da der Algorithmus angewendet wird. Sie müssen also mit unterschiedlichen RF.QF -Werten experimentieren, bis Sie basierend auf Ihrer Suchkonfiguration den richtigen Einfluss auf Ihre Abfrage finden. Angesichts der Tatsache, dass die für jeden Benutzer generierte Rocchio -Abfrage in der Suchsitzung des Benutzers (abhängig von Ihrem Anwendungsfall natürlich) wahrscheinlich gleich ist, besteht eine effizientere Möglichkeit, dies zu verwenden, um Personalisierung durchzuführen, nur um den RF -Handler zu verwenden, um die Rochio -Abfrage für Sie einmal zu generieren, wenn der Benutzer in der Suchanfraged -Anmeldung, bei der Sie regelmäßig Suchanfrages -Abfrages -Abfrages -Abfragetechnik sind, für die Personalabfragelung, für die Personalisation, für die Personalisation. Der Handler gibt die Rocchio -Abfrage im RF.Query -Parameter in der Antwort zurück. Wenn Sie den Handler verwenden möchten, um die Abfrage zu erhalten (und die Suche nicht auszuführen), können Sie den Parameter von Zeilen auf 0 festlegen. Sie können auch über den Satz „interessanter Begriffe“ durch den Algorithmus zurückgegeben werden, zusammen mit ihren Gewichten, wenn Sie RF.Interestingerms = Details einstellen und diese verwenden, um Ihre Boost -Abfrage zu erstellen.
Abgesehen davon, dass dies mit weiteren Versionen von Solr funktioniert (hinterlassen Sie Feedback, welche Versionen Sie alle möchten), gibt es eine Reihe möglicher Verbesserungen:
Wenn Sie eine Feature -Anfrage haben, senden Sie sie bitte an die Ausgustliste. Wenn Sie Fragen haben, ist dies auch ein guter Ort, um sie zu veröffentlichen, aber Sie können mich auch unter [email protected] an mich wenden, wenn Sie nicht hier zurück sind.