Changeset 31570

Show
Ignore:
Timestamp:
03.04.2017 23:04:19 (2 years ago)
Author:
davidb
Message:

Solr-stream based search

Location:
other-projects/hathitrust/wcsa/extracted-features-solr/trunk/web-portal
Files:
1 added
3 modified

Legend:

Unmodified
Added
Removed
  • other-projects/hathitrust/wcsa/extracted-features-solr/trunk/web-portal/index.css

    r31524 r31570  
     1table.query-table tr td { 
     2    padding-top: 4px; 
     3    padding-bottom: 4px; 
     4    padding-right: 6px; 
     5} 
     6 
    17.show-hide-lang { 
    28    display: none; 
  • other-projects/hathitrust/wcsa/extracted-features-solr/trunk/web-portal/index.html

    r31524 r31570  
    294294             
    295295    <div class="container"> 
    296       <h4>Admin Resources</h4> 
     296      <h4>Additional Resources</h4> 
    297297      <ul> 
     298    <li><a href="stream-query.html">Combined Volume Metadata and Page-levelPOS Term searching</a></li> 
    298299    <li><a href="admin.html">HTRC-EF Solr Admin UI (log in)</a></li> 
    299300    <li><a href="luke_lang_mappings.html">Dynamically Generated Language Map (Part-of-Speech, and Other)</a></li> 
  • other-projects/hathitrust/wcsa/extracted-features-solr/trunk/web-portal/index.js

    r31524 r31570  
    5757} 
    5858 
     59function stream_generate_item(line,id,title) 
     60{ 
     61    var css_class = (line%2 == 0) ? 'class="evenline"' : 'class="oddline"'; 
     62     
     63    var html_item = ""; 
     64 
     65 
     66    var babel_url = "https://babel.hathitrust.org/cgi/pt?id="+id+";view=1up;seq="+0; 
     67 
     68    html_item += '<p ' + css_class + '>'; 
     69    //html_item += ' <span style="font-style: italic;" name="'+id+'"></span><br>'; 
     70    html_item += '<a target="_blank" href="' + babel_url + '">' + id + ': ' + title + '</a>'; 
     71    html_item += '</p>'; 
     72 
     73    return html_item; 
     74} 
     75 
    5976 
    6077function generate_item(line,id,id_pages) 
     
    105122} 
    106123 
    107 function show_results(jsonData) { 
    108     var response = jsonData.response; 
    109     var num_found = response.numFound; 
    110     var docs = response.docs; 
    111     var num_docs = docs.length; 
     124function stream_show_results(jsonData) { 
     125    var docs = jsonData["result-set"].docs; 
     126    var num_docs = docs.length -1; 
    112127 
    113128    $('.search-in-progress').css("cursor","auto"); 
     
    116131 
    117132    if (num_docs>0) { 
    118     $search_results.html("<p>Results: " + num_found + " pages matched</p>"); 
     133    $search_results.html("<p>Results: " + num_docs + " volumes matched</p>"); 
     134    /* 
    119135    var from = parseInt(store_search_args.start); 
    120136    var to = from + num_rows; 
    121137    $search_results.append("<p>Showing matches: "+from+"-" + to + "</p>"); 
     138    */ 
    122139    } 
    123140    else { 
    124     $search_results.html("<p>No pages matched your query</p>"); 
    125     } 
    126  
    127      
    128     // https://babel.hathitrust.org/cgi/pt?id=hvd.hnnssu;view=1up;seq=11 
    129  
     141    $search_results.html("<p>No volumes matched your query</p>"); 
     142    } 
     143 
     144    for (var i=0; i<num_docs; i++) { 
     145    var doc = docs[i]; 
     146    var id = doc.id; 
     147    var title = doc.title_t; 
     148 
     149    var html_item = stream_generate_item(i,id,title); 
     150    $search_results.append(html_item); 
     151    } 
     152    return; 
     153    // **** 
     154     
    130155    var htids = []; 
    131156 
     
    155180    } 
    156181     
    157 //  var css_class = (i%2 == 0) ? 'class="evenline"' : 'class="oddline"'; 
    158 //  //var restful_safe_id = id.replace(/\./g,",").replace(/:/g, "+").replace(/\//g, "="); 
    159      
    160 //  var babel_url = "https://babel.hathitrust.org/cgi/pt?id="+id+";view=1up;seq="+seqnum; 
    161  
    162 //  var result_item = '<a target="_blank" href="' + babel_url + '">' + id + ', page ' + page + '</a>'; 
    163 //  result_item += ' <span style="font-style: italic;" name="'+id+'"><span style="cursor: progress;">Loading ...</span></span>'; 
    164 //  $search_results.append('<p ' + css_class + '>'+result_item+'</p>'); 
    165  
    166182    htids.push("htid:"+id); 
    167183 
     
    203219} 
    204220 
     221 
     222function show_results(jsonData) { 
     223    var response = jsonData.response; 
     224    var num_found = response.numFound; 
     225    var docs = response.docs; 
     226    var num_docs = docs.length; 
     227 
     228    $('.search-in-progress').css("cursor","auto"); 
     229     
     230    var $search_results = $('#search-results'); 
     231 
     232    if (num_docs>0) { 
     233    $search_results.html("<p>Results: " + num_found + " pages matched</p>"); 
     234    var from = parseInt(store_search_args.start); 
     235    var to = from + num_rows; 
     236    $search_results.append("<p>Showing matches: "+from+"-" + to + "</p>"); 
     237    } 
     238    else { 
     239    $search_results.html("<p>No pages matched your query</p>"); 
     240    } 
     241 
     242     
     243    // https://babel.hathitrust.org/cgi/pt?id=hvd.hnnssu;view=1up;seq=11 
     244 
     245    var htids = []; 
     246 
     247    var prev_id = null; 
     248    var prev_pages = []; 
     249     
     250    var i=0; 
     251    var line_num = 0; 
     252    while (i<num_docs) { 
     253//    for (var i=0; i<num_docs; i++) { 
     254    var doc = docs[i]; 
     255    var id_and_page = doc.id.split(".page-"); 
     256    var id = id_and_page[0]; 
     257    var seqnum = parseInt(id_and_page[1]); 
     258    var page = seqnum+1; 
     259 
     260    if ((prev_id != null) && (id != prev_id)) { 
     261        // time to output previous item 
     262        var html_item = generate_item(line_num,prev_id,prev_pages); 
     263        $search_results.append(html_item); 
     264        line_num++; 
     265        prev_pages = [page]; 
     266    } 
     267    else { 
     268        // accumulate pages 
     269        prev_pages.push(page) 
     270    } 
     271     
     272//  var css_class = (i%2 == 0) ? 'class="evenline"' : 'class="oddline"'; 
     273//  //var restful_safe_id = id.replace(/\./g,",").replace(/:/g, "+").replace(/\//g, "="); 
     274     
     275//  var babel_url = "https://babel.hathitrust.org/cgi/pt?id="+id+";view=1up;seq="+seqnum; 
     276 
     277//  var result_item = '<a target="_blank" href="' + babel_url + '">' + id + ', page ' + page + '</a>'; 
     278//  result_item += ' <span style="font-style: italic;" name="'+id+'"><span style="cursor: progress;">Loading ...</span></span>'; 
     279//  $search_results.append('<p ' + css_class + '>'+result_item+'</p>'); 
     280 
     281    htids.push("htid:"+id); 
     282 
     283    prev_id = id; 
     284    i++; 
     285    } 
     286     
     287    var html_item = generate_item(line_num,prev_id,prev_pages); 
     288    $search_results.append(html_item); 
     289 
     290     
     291    document.location.href="#search-results-anchor"; 
     292     
     293    var next_prev = '<p style="width:100%;"><div id="search-prev" style="float: left;"><a>&lt; Previous</a></div><div id="search-next" style="float: right;"><a>Next &gt;</a></div></p>'; 
     294     
     295    $search_results.append(next_prev); 
     296    $('#search-prev').click(function(event) { show_new_results(-1*num_rows); }); 
     297    $('#search-next').click(function(event) { show_new_results(num_rows); }); 
     298 
     299    var search_start = store_search_args.start; 
     300    if (search_start==0) { 
     301    $('#search-prev').hide(); 
     302    } 
     303     
     304    // Example URL for catalog metadata (multiple items) 
     305    // http://catalog.hathitrust.org/api/volumes/brief/json/id:552;lccn:70628581|isbn:0030110408 
     306 
     307    var htids_str = htids.join("|",htids); 
     308    var cat_url = "http://catalog.hathitrust.org/api/volumes/brief/json/" + htids_str; 
     309        $.ajax({ 
     310        url: cat_url, 
     311        dataType: 'jsonp', 
     312        jsonpCallback: "add_titles" 
     313    }); 
     314 
     315 
     316    //var json_pretty = JSON.stringify(jsonData.response, null, '\t'); 
     317    //$('#search-results').text(json_pretty) 
     318} 
     319 
    205320var store_search_args = null; 
    206321var store_search_action = null; 
    207322 
    208323var group_by_vol_checked = 0; 
     324 
     325function stream_submit_action(event) 
     326{ 
     327    event.preventDefault(); 
     328 
     329    $('.search-in-progress').css("cursor","wait"); 
     330 
     331    var vq_text     = $('#vq').val(); 
     332     
     333    store_search_action = $('#search-form').attr("action"); 
     334     
     335    var arg_indent = $('#indent').attr('value'); 
     336    var arg_wt     = $('#wt').attr('value'); 
     337    var arg_start  = $('#start').attr('value'); 
     338    var arg_rows   = $('#rows').attr('value'); 
     339    var q_text     = $('#q').val(); 
     340 
     341    group_by_vol_checked = $('#group-results-by-id:checked').length; 
     342 
     343     
     344    if ((q_text === "") && (vq_text === "")) { 
     345    $('.search-in-progress').css("cursor","auto"); 
     346    alert("No query term entered"); 
     347    return; 
     348    } 
     349 
     350    var expr_all = ""; 
     351    var expr_md = ""; 
     352    var expr_tx = ""; 
     353     
     354    if (vq_text !== "") { 
     355    // simplified case of issuing a volume-based metadata query 
     356    //expr=search(col,q,fl,sort,rows) 
     357 
     358     
     359    //var expr = "expr=search("; 
     360    expr_md = "search("; 
     361    expr_md += "htrc-full-ef20"; 
     362    expr_md += ",q=\""+vq_text+"\""; 
     363    expr_md += ",fl=\"volumeid_s,id,title_t\""; 
     364    expr_md += ",sort=\"id asc"+"\""; 
     365    expr_md += ",indent=\""+arg_indent+"\""; 
     366    expr_md += ",wt=\""+arg_wt+"\""; 
     367    expr_md += ",start=\""+arg_start+"\""; 
     368    expr_md += ",rows=\""+arg_rows+"\""; 
     369    expr_md += ")"; 
     370     
     371    store_search_args = { q: vq_text, indent: arg_indent, wt: arg_wt, 
     372                  start: arg_start, rows: arg_rows }; 
     373    } 
     374 
     375    if (q_text !== "") { 
     376     
     377    var fields = []; 
     378    var universal_pos_tags = [ "VERB", "NOUN", "ADJ", "ADV", "ADP", "CONJ", "DET", "NUM", "PRT", "X" ]; 
     379 
     380    var arg_q = ""; 
     381     
     382    var split_q_text = q_text.split(/\s+/); 
     383    for (var qi=0; qi<split_q_text.length; qi++) { 
     384        q_text = split_q_text[qi]; 
     385         
     386        for (var li=0; li<langs_with_pos.length; li++) { 
     387        var lang = langs_with_pos[li]; 
     388        var lang_enabled_id = lang + "-enabled"; 
     389        var $lang_enabled_cb = $('#'+lang_enabled_id); 
     390        if ($lang_enabled_cb.is(':checked')) { 
     391            console.log("Extracting POS tags for: " + lang); 
     392             
     393            for (var ti=0; ti<universal_pos_tags.length; ti++) { 
     394            var tag = universal_pos_tags[ti]; 
     395            var lang_tag_id = lang+"-"+tag+"-htrctoken-cb"; 
     396            var $lang_tag_cb = $('#'+lang_tag_id); 
     397            if ($lang_tag_cb.is(':checked')) { 
     398                //var lang_tag_field = "xxxx"+lang+"_"+tag+"_htrctoken"; 
     399                var lang_tag_field = lang+"_"+tag+"_htrctoken"; 
     400                fields.push(lang_tag_field+":"+q_text); 
     401            } 
     402            } 
     403        } 
     404        } 
     405         
     406        for (var li=0; li<langs_without_pos.length; li++) { 
     407        var lang = langs_without_pos[li]; 
     408        var lang_enabled_id = lang + "-enabled"; 
     409        var $lang_enabled_cb = $('#'+lang_enabled_id); 
     410         
     411        if ($lang_enabled_cb.is(':checked')) { 
     412            console.log("Adding in non-POS field for: " + lang); 
     413            //var lang_tag_field = "xxxx"+lang+"_htrctoken"; 
     414            var lang_tag_field = lang+"_htrctoken"; 
     415            fields.push(lang_tag_field+":"+q_text);      
     416        } 
     417        } 
     418     
     419        if (fields.length == 0) { 
     420        alert("No languages selected"); 
     421        return; 
     422        } 
     423 
     424        if (qi>0) { 
     425        arg_q += " OR "; 
     426        } 
     427         
     428        arg_q += fields.join(" OR "); 
     429     
     430    } // end of for each split q_text 
     431     
     432    // Example search on one of the htrc-full-ef fields is:  
     433    //  q=en_NOUN_htrctoken:farming 
     434     
     435    store_search_args = { q: arg_q, indent: arg_indent, wt: arg_wt, start: arg_start, rows: arg_rows }; 
     436 
     437    store_search_args.sort="id asc"; 
     438    store_search_args.fl="volumeid_s,id"; 
     439     
     440    var expr_tx = "search(htrc-full-ef20"; 
     441     
     442    for (var k in store_search_args) { 
     443        if (store_search_args.hasOwnProperty(k)) { 
     444        var v = store_search_args[k]; 
     445        expr_tx += "," + k + "=\"" + v + "\""; 
     446        } 
     447    } 
     448    expr_tx += ")"; 
     449    } 
     450     
     451 
     452    if ((expr_md != "") && (expr_tx != "")) { 
     453    expr = "expr=intersect(" + expr_md + "," + expr_tx  + ", on=\"id=volumeid_s\")"; 
     454    } 
     455    else if (expr_md != "") { 
     456    expr = "expr=" + expr_md; 
     457    } 
     458    else if (expr_tx != "") { 
     459    expr = "expr=" + expr_tx; 
     460    } 
     461    else { 
     462    // both empty 
     463    console.log("Warning: query was empty"); 
     464    } 
     465     
     466 
     467    $.ajax({ 
     468    type: 'GET', 
     469    url: store_search_action, 
     470    data: expr, 
     471    dataType: 'json', 
     472    success: stream_show_results, 
     473    error: ajax_error 
     474    }); 
     475 
     476} 
    209477 
    210478function submit_action(event) 
     
    437705 
    438706    generate_other_langs(); 
    439      
    440     $('#search-submit').click(submit_action); 
     707 
     708    if ($('#search-submit').length>0) { 
     709    $('#search-submit').click(submit_action); 
     710    } 
     711     
     712    if ($('#stream-search-submit').length>0) { 
     713    $('#stream-search-submit').click(stream_submit_action); 
     714    } 
    441715 
    442716});