Plugin Solr dice.com untuk melakukan pencarian yang dipersonalisasi, dan rekomendasi (melalui plugin umpan balik relevansi) dan pencarian konseptual / semantik (melalui plugin umpan balik tanpa pengawasan).
File jar yang pra-dibangun dapat ditemukan di folder ./target . Proyek ini berisi file Maven pom.xml yang juga dapat digunakan untuk membangunnya dari sumber.
Jika ada versi tertentu dari SOLR yang Anda butuhkan untuk ini, silakan buat masalah github dan saya akan melihat apa yang bisa saya lakukan. Untuk mengkompilasi secara manual untuk versi tertentu, gunakan Maven untuk mengkompilasi plugin menggunakan file pom.xml, dan perbarui versi perpustakaan Solr dan Lucene dalam file itu, dan gunakan Maven untuk menarik ketergantungan tersebut. Kemudian perbaiki kesalahan kompilasi apa pun.
Silakan lihat pedoman SOLR resmi untuk mendaftarkan plugin dengan SOLR. Ini pada dasarnya melibatkan hanya menjatuhkan file JAR ke salah satu folder yang Solr memeriksa untuk file kelas dan jar pada pemuat ulang inti.
Contoh konfigurasi penangan permintaan untuk solrconfig.xml ditunjukkan di bawah ini, dengan komentar yang menguraikan parameter utama:
<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? Q = ID: 11F407D319D6CC707437FAD874A097C0+ID: A2FD2F2E 34667D61FADCDCABFD359CF4 & Baris = 10 & df = Judul & FL = Judul, Keterampilan, 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"
},...
]
}
}
Contoh konfigurasi penangan permintaan untuk solrconfig.xml ditunjukkan di bawah ini, dengan komentar yang menguraikan parameter utama:
<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? q = mesin+belajar+insinyur & mulai = 0 & baris = 10 & uf.logtf = false & false & false fl = judul, keterampilan, geocode, kota, 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"
},...
]
}
Meskipun secara longgar didasarkan pada kode pawang Solr MLT dan algoritma (yang hanya algoritma Rocchio), ada beberapa perbedaan utama dalam desain algoritma. Handler MLT mengambil istilah k teratas di semua bidang yang dikonfigurasi saat membangun kueri MLT. Jika Anda memiliki bidang yang memiliki kosa kata yang lebih luas daripada bidang lainnya, frekuensi dokumen rata -rata suatu istilah akan lebih rendah daripada di bidang lain dengan kosa kata yang lebih kecil. Ini berarti bahwa istilah -istilah ini akan memiliki skor IDF relatif tinggi dan cenderung mendominasi istilah teratas yang dipilih oleh solr MLT Handler. Penangan permintaan kami mengambil istilah k teratas per bidang. Ini juga memastikan bahwa tidak peduli berapa banyak istilah yang dicocokkan per bidang (hingga batas yang dikonfigurasi), bidang itu memiliki bobot yang sama dalam kueri yang dihasilkan seperti semua bidang lainnya, sebelum bidang spesifik bidang yang ditentukan dalam parameter RF.QF diterapkan. Ini adalah masalah kedua dengan pawang Solr MLT yang kami atasi. Kami juga menyediakan banyak fungsi tambahan. Kami memungkinkan untuk meneruskan aliran konten, mencocokkan dengan beberapa dokumen (lebih seperti 'ini' sebagai lawan dari lebih seperti 'ini'), menerapkan parser query boost ke kueri MLT yang dihasilkan untuk memungkinkan setiap dorongan SOLR sewenang -wenang diterapkan (multiplikasi). Dan kami mendukung parameter MM, sehingga kami dapat memaksa dokumen untuk kembali yang hanya cocok dengan satu set % dari istilah teratas.
Jika Anda ingin menggunakan ini untuk melakukan personalisasi pencarian, seperti yang ditunjukkan dalam pembicaraan Lucene Revolution 2017 saya, Anda perlu meneruskan permintaan pencarian pengguna saat ini menggunakan parameter Q reguler, dan informasi yang digunakan untuk menghasilkan kueri Rocchio dilewatkan melalui parameter RF.Q (saat menggunakan Konten. Namun, perhatikan bahwa peningkatan yang diterapkan pada istilah dalam kueri Rocchio tidak memiliki bobot komparatif bagi yang ada dalam kueri pengguna Anda, karena proses normalisasi yang berlaku algoritma. Jadi, Anda perlu bereksperimen dengan nilai RF.QF yang berbeda sampai Anda menemukan tingkat pengaruh yang tepat pada kueri Anda, berdasarkan konfigurasi pencarian Anda. Juga, mengingat bahwa kueri Rocchio yang dihasilkan untuk setiap pengguna kemungkinan sama di seluruh sesi pencarian pengguna (tergantung pada kasus penggunaan Anda tentu saja), cara yang lebih efisien menggunakan ini untuk melakukan personalisasi adalah dengan menggunakan pawang RF untuk menghasilkan permintaan rochio untuk Anda ketika pengguna masuk, men -cache ini, dan kemudian menggunakannya sebagai pemasukan roki. Handler mengembalikan kueri Rocchio di parameter RF.Query dalam respons. Jika Anda ingin menggunakan pawang hanya untuk mendapatkan kueri (dan tidak menjalankan pencarian), Anda dapat mengatur parameter baris ke 0. Anda juga dapat mengulangi serangkaian 'istilah menarik' yang dikembalikan oleh algoritma, bersama dengan bobot mereka, jika Anda mengatur rf.Interestterms = detail, dan menggunakan ini untuk membangun query boost Anda.
Selain memastikan ini berfungsi dengan lebih banyak versi Solr (silakan tinggalkan umpan balik tentang versi mana yang Anda inginkan), ada sejumlah peningkatan yang mungkin:
Jika Anda memiliki permintaan fitur, silakan kirimkan ke daftar masalah. Jika Anda memiliki pertanyaan, itu juga tempat yang baik untuk mempostingnya, tetapi Anda juga dapat menghubungi saya di [email protected] jika Anda tidak kembali ke sini.