الإضافات SOLR الخاصة بـ Dice.com لإجراء بحث مخصص ، والتوصيات (عبر البرنامج المساعد للتغذية المرتدة) والبحث المفاهيمي / الدلالي (عبر البرنامج المساعد غير الخاضع للإشراف).
يمكن العثور على ملف جرة مسبقًا في المجلد ./target . يحتوي المشروع على ملف maven pom.xml والذي يمكن استخدامه أيضًا لبناءه من المصدر.
إذا كان هناك إصدار معين من SOLR ، فأنت بحاجة إلى ذلك ، فيرجى إنشاء مشكلة github وسأرى ما يمكنني فعله. لتجميعه يدويًا لإصدار معين ، استخدم Maven لتجميع المكونات الإضافية باستخدام ملف POM.xml ، وتحديث إصدارات مكتبات Solr و Lucene في هذا الملف ، واستخدام Maven لسحب هذه التبعيات. ثم إصلاح أي أخطاء التجميع.
يرجى الاطلاع على إرشادات SOLR الرسمية لتسجيل الإضافات مع SOLR. يتضمن هذا بشكل أساسي ببساطة إسقاط ملف JAR في أحد المجلدات التي تتحقق من SOLR من ملفات الفئة وجرة على إعادة التحميل الأساسي.
يظهر أدناه تكوين معالج الطلب لـ solrconfig.xml أدناه ، مع التعليقات التي تحدد المعلمات الرئيسية:
<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 = TITLE & FL = TITLE ، MAINTS ، GEOCODE ، CITAL ، 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"
},...
]
}
}
يظهر أدناه تكوين معالج الطلب لـ solrconfig.xml أدناه ، مع التعليقات التي تحدد المعلمات الرئيسية:
<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/ufselect؟ fl = العنوان ، المهارات ، الجيولوجية ، المدينة ، الدولة و 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"
},...
]
}
على الرغم من أنه يعتمد بشكل فضفاض على رمز معالج Solr MLT والخوارزمية (وهو مجرد خوارزمية Rocchio) ، هناك بعض الاختلافات الرئيسية في تصميم الخوارزمية. يأخذ معالج MLT أعلى مصطلحات K عبر جميع الحقول التي تم تكوينها عند إنشاء استعلام MLT. إذا كان لديك حقل يحتوي على مفردات أوسع من الحقول الأخرى ، فسيكون متوسط تردد المستند للمصطلح أقل من الحقول الأخرى ذات المفردات الصغيرة. هذا يعني أن هذه المصطلحات ستحصل على درجات عالية نسبية للاتحاد الايرلندي وتميل إلى السيطرة على المصطلحات العليا التي تم تحديدها بواسطة معالج SOLR MLT. يأخذ معالج طلبنا أفضل شروط K لكل حقل. ويضمن أيضًا أنه بغض النظر عن عدد المصطلحات التي يتم مطابقة لكل حقل (حتى الحد الأقصى المكون) ، فإن هذا الحقل له نفس الترجيح في الاستعلام الناتج مثل جميع الحقول الأخرى ، قبل تطبيق الأوزان المحددة المحددة في المعلمة RF.QF. هذه هي المشكلة الثانية مع معالج SOLR MLT الذي نتناوله. نحن نقدم أيضا الكثير من الوظائف الإضافية. نسمح بالمرور في تدفقات المحتوى ، والمطابقة مع مستندات متعددة (أشبه "هذه" بدلاً من أكثر مثل "هذا") ، وتطبيق محلل الاستعلام التعزيز على استعلام MLT الناتج للسماح بتطبيق أي دفعة SOLR التعسفية (مضاعفة). ونحن ندعم المعلمة MM ، حتى نتمكن من فرض المستندات على العودة التي تتطابق مع مجموعة ٪ من المصطلحات العليا فقط.
إذا كنت ترغب في استخدام هذا لإجراء تخصيص البحث ، كما هو موضح في حديث Lucene Revolution 2017 ، فأنت بحاجة إلى تمرير استعلام البحث الحالي للمستخدم باستخدام المعلمة Q العادية ، والمعلومات المستخدمة لإنشاء استعلام Rocchio عبر معلمة RF.Q (عند استخدام المستندات لإنشاء ROCCHIO) أو عبر مداول المحتوى (RF.STEREAM.STREAM.TSERENTER. ومع ذلك ، لاحظ أن التعزيزات المطبقة على المصطلحات في استعلام Rocchio ليست ذات أوزان مقارنة لتلك الموجودة في استعلام المستخدم الخاص بك ، نظرًا لعملية التطبيع التي تنطبق عليها الخوارزمية. لذلك ستحتاج إلى تجربة قيم RF.QF مختلفة حتى تجد المستوى الصحيح للتأثير على استعلامك ، بناءً على تكوين البحث الخاص بك. أيضًا ، بالنظر إلى أن استعلام Rocchio الذي تم إنشاؤه لكل مستخدم هو نفسه عبر جلسة البحث الخاصة بالمستخدم (اعتمادًا على حالة الاستخدام الخاصة بك بالطبع) ، فإن طريقة أكثر فعالية لاستخدام هذا للقيام بالتخصيص هي ببساطة استخدام معالج RF لإنشاء استعلام Rochio لك مرة واحدة عندما يقوم المستخدم بتسجيل الدخول إلى هذا التعليق ، ثم استخدامها كمعالج البحث عن المستخدم. يعيد المعالج استعلام Rocchio في معلمة RF.Query في الاستجابة. إذا كنت ترغب في استخدام المعالج لمجرد الحصول على الاستعلام (وعدم تنفيذ البحث) ، فيمكنك تعيين معلمة الصفوف على 0. يمكنك أيضًا التكرار على مجموعة "المصطلحات المثيرة للاهتمام" التي يتم إرجاعها بواسطة الخوارزمية ، إلى جانب أوزانها ، إذا قمت بتعيين RF.Interestingterms = التفاصيل ، واستخدامها لبناء استعداد دفعة.
بصرف النظر عن ضمان هذا العمل مع المزيد من إصدارات SOLR (يرجى ترك تعليقات حول الإصدارات التي تريدها جميعًا) ، هناك عدد من التحسينات الممكنة:
إذا كان لديك طلب ميزة ، فيرجى إرساله إلى قائمة المشكلات. إذا كانت لديك أسئلة ، فهذا مكان جيد أيضًا لنشرها ، ولكن يمكنك أيضًا التواصل معي على [email protected] إذا لم تعد هنا.