Uploaded image for project: 'Solr'
  1. Solr
  2. SOLR-7576

Implement RequestHandler in Javascript

    XMLWordPrintableJSON

    Details

    • Type: New Feature
    • Status: Closed
    • Priority: Major
    • Resolution: Won't Fix
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None

      Description

      Solr now support dynamic loading (SOLR-7073) of components and it is secured in SOLR-7126

      We can extend the same functionality with JS as well

      the handler /js is implicitly registered
      To make this work

      • Solr should be started with -Denable.js.loading=true
      • The javascript must be loaded to the .system collection using the blob store API
      • Sign the javascript and pass the signature in a param called _sig

      The JSRequestHandler is implicitly defined and it can be accessed by hitting /js/<jsname>/<version>

      Steps for developing scripts

      1. start the cluster with the enable.js.loading . If you are starting using our script it would be bin/solr start -e cloud -a "-Denable.js.loading=true" . You would not need security during development , so don't add the private keys to Solr
      2. create .system collection bin/solr create -c .system
      3. Write your javascript code . (say test.js )
      4. post it to .system collection . curl -X POST -H 'Content-Type: application/octet-stream' --data-binary @test.js http://localhost:8983/solr/.system/blob/test
      5. run your script http://host:8983/solr/gettingstarted/js/test/1
      6. Edit your script and repeat from step #4 . Keep in mind that the version would be bumped up every time you post a new script . So, the second time the url would be http://host:8983/solr/gettingstarted/js/test/2 . So on and so forth

      sample programs
      1) writes a val to output

      //empty line
      $.response().add('testkey','Test Val');
      

      2) manipulate the output to add an extra field to each doc

      //empty line
      var l = [];
      $.query({
                    q: '*:*',
                    qt: '/select',
                    start:0,
                }).forEach('response', function(doc) {
                                               doc.put('script', 'Added this value');
                                               l.push(doc);
                });
       $.response().add('alldocs', l);
      

      3) stream through all the docs

      //empty line
      $.query({
                    q: '*:*',
                    qt: '/select',
                    start:0,
                    distrib:'false'
                }).pipe('response', 'docs', function(doc) { // the pipe function is executed right before the response writer and right after the transformers   
                                               if('IT'== doc.get('genre_s')) return null;
                                               doc.put('script', 'Added this value');
                                               return doc;
      
                });
      

        Attachments

        1. SOLR-7576.patch
          50 kB
          Noble Paul
        2. SOLR-7576.patch
          35 kB
          Noble Paul

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                noble.paul Noble Paul
              • Votes:
                2 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: