Ignore:
Timestamp:
29/11/07 10:15:03 (12 years ago)
Author:
lawrence
Message:

Semantic Search support in discovery
(Hopefully this is all the relevant files, my sandbox is in a bit of a
state)

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/discovery.py

    r3014 r3069  
    55from ows_server.models import ndgSearch as NS 
    66from ows_server.models.DocumentRetrieve import DocumentRetrieve as DR 
     7from ows_server.models.DocumentRetrieve import ndgVocabPOX as VS 
    78from ows_server.models.DIF import DIF 
    89from ows_server.templates.renderDiscoverySet import renderDiscoverySet 
     
    1213from ows_server.lib.mailer import mailHandler 
    1314from ows_server.models.xmlHandler2 import xmlHandler 
     15debug=0 
    1416 
    1517 
     
    155157        print howmany,hits 
    156158        c.state=DiscoveryState(id,searchString,request.environ,hits,searchConstraints,start,howmany) 
     159        c.querystring=request.environ['QUERY_STRING'] 
    157160        print c.state 
    158161         
     
    202205                 
    203206                c.difs=difs 
    204                 if 'searchString' in self.inputs: 
    205                     c.querystring='searchString=%s&textTarget=%s'%(self.inputs['searchString'],self.inputs['textTarget']) 
    206                 else: 
    207                     c.querystring='' 
     207                 
    208208                session['results']=h.current_url() 
    209209                session.save() 
     
    292292     
    293293    def semantic(self): 
    294         c.constraints=request.environ['QUERY_STRING'] 
     294        self.__setup() 
     295        vs=VS(proxyServer=self.cf.get('DEFAULT','proxyServer')) 
     296        if 'searchString' in self.inputs: 
     297            [broader,narrower]=vs.getRelated(self.inputs['searchString']) 
     298            c.narrower=narrower 
     299            c.broader=broader 
     300            #get a base string for the links to new searches 
     301            if 'start' in self.inputs: del self.inputs['start'] 
     302            if 'howmany' in self.inputs: del self.inputs['howmany'] 
     303            self.inputs['searchString']='###SEARCHSSTRING###' 
     304            q='%s/discovery?'%g.server 
     305            for i in self.inputs: q+='%s=%s&'%(i,self.inputs[i]) 
     306            url=q[0:-1] 
     307            # and now build the links  
     308            c.narrower=[] 
     309            c.broader=[] 
     310            for i in narrower: 
     311                c.narrower.append((i,url.replace('###SEARCHSSTRING###',i))) 
     312            for i in broader: 
     313                c.broader.append((i,url.replace('###SEARCHSSTRING###',i))) 
     314        else: 
     315            broader,narrower=[],[] 
     316         
    295317        return render_response('semantic',fragment=True) 
    296318     
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/retrieve.py

    r2976 r3069  
    100100                    r='content' 
    101101            else: 
     102                name=str(self.uri) 
    102103                if self.format=='xml': 
    103104                    c.xml=x.tohtml() 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/DocumentRetrieve.py

    r2976 r3069  
    22from ndg_xqueries import * 
    33from xml.dom import minidom  
     4try: 
     5    from xml.etree import ElementTree as ET 
     6except: 
     7    import ElementTree as ET 
    48import urllib2 
    59#from stripped_xqueries import strip_de_xquery 
     
    3539            xquery=xquery.replace('TargetCollection',targetCollection) 
    3640            xquery=xquery.replace('LocalID',localID) 
    37             print xquery 
     41            if debug:print xquery 
    3842            id,summary=self.executeQuery(xquery) 
    3943            if summary['hits']==1: 
     
    118122        return r 
    119123             
    120 class ndgHTTP: 
    121     ''' Provides a get method to obtain an xml document from a remote NDG repository ''' 
    122     def __init__(self,remoteHost,proxyServer=None): 
    123         self.remoteHost=remoteHost 
     124class genericHTTP(object): 
     125    ''' Provides a generic HTTP request class ''' 
     126    def __init__(self,proxyServer=None): 
    124127        if proxyServer is None: 
    125128            proxyHandler=urllib2.ProxyHandler({}) 
     
    130133        self.opener=urllib2.build_opener(proxyHandler) 
    131134         
    132     def uriget(self,uri): 
    133         n=ndgObject(uri) 
    134         return self.get(n.repository,n.schema,n.localID) 
    135  
    136     def get(self,repository,schema,localID,format='NDG-B0',targetCollection=None): 
    137         #last two arguments for compatibiltiy with API, not for use in restful get ... 
    138         #TODO what about security? Probably means we need to get the headers of our responses sorted ... 
    139         url='%s/view/%s__%s__%s?format=raw&outputSchema=%s'%(self.remoteHost,repository,schema,localID,format) 
    140         #http://docs.python.org/lib/urllib2-examples.html 
     135    def get(self,url): 
    141136        request=urllib2.Request(url) 
    142137        response='Error obtaining remote file: ' 
     
    156151            return f.read() 
    157152        else: 
    158             raise IOError(response) 
     153            raise IOError(response)   
     154             
     155class ndgHTTP(genericHTTP): 
     156    ''' Provides a get method to obtain an xml document from a remote NDG repository ''' 
     157    def __init__(self,remoteHost,proxyServer=None): 
     158        self.remoteHost=remoteHost 
     159        genericHTTP.__init__(self,proxyServer) 
     160         
     161    def uriget(self,uri): 
     162        n=ndgObject(uri) 
     163        return self.get(n.repository,n.schema,n.localID) 
     164 
     165    def get(self,repository,schema,localID,format='NDG-B0',targetCollection=None): 
     166        #last two arguments for compatibiltiy with API, not for use in restful get ... 
     167        #TODO what about security? Probably means we need to get the headers of our responses sorted ... 
     168        url='%s/view/%s__%s__%s?format=raw&outputSchema=%s'%(self.remoteHost,repository,schema,localID,format) 
     169        #http://docs.python.org/lib/urllib2-examples.html 
     170        return genericHTTP.get(self,url) 
    159171         
    160172    def setSecurity(self,location,usercode,password): 
     
    162174        pass 
    163175     
     176class ndgVocabPOX(genericHTTP): 
     177    ''' Provides a POX interface to the vocab server ''' 
     178    def __init__(self,path="http://vocab.ndg.nerc.ac.uk/axis2/services/vocab/",proxyServer=None): 
     179        genericHTTP.__init__(self,proxyServer) 
     180        self.path="http://vocab.ndg.nerc.ac.uk/axis2/services/vocab/" 
     181        self.ns="http://vocab.ndg.nerc.ac.uk/" 
     182    def getRelated(self,subject): 
     183        ''' Get a related record ''' 
     184        url='%sgetRelatedRecordByCriteria?subjectText=%s&predicate=255&inferences=True&objectList=%slist/P211/current'%(self.path,subject,self.ns) 
     185        self.url=url 
     186        doc=genericHTTP.get(self,url) 
     187        x=ET.fromstring(doc) 
     188        b=x.findall('*/{urn:vocab/types}broadMatch') 
     189        n=x.findall('*/{urn:vocab/types}narrowMatch') 
     190        self.broader=[(i.find('{urn:vocab/types}entryTerm').text or '') for i in b] 
     191        self.narrower=[(i.find('{urn:vocab/types}entryTerm').text or '') for i in n] 
     192        return [self.broader,self.narrower] 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgRetrieve.py

    r2976 r3069  
    100100    def testSOAP(self): 
    101101        ''' test link to SOAP web service for DIF''' 
    102  
    103102        self.setup() 
    104         doc='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 
     103        doc='neodc.nerc.ac.uk__DIF__dataent_11707799142713994' 
    105104        uri=ndgObject.ndgObject(doc) 
    106105        status,xml=ndgRetrieve(uri,self.c) 
     
    109108    def testOriSOAP(self): 
    110109        ''' test link to SOAP web service for DIF (original version)''' 
    111  
    112110        self.setup() 
    113         doc='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 
     111        doc='neodc.nerc.ac.uk__DIF__dataent_11707799142713994' 
    114112        uri=ndgObject.ndgObject(doc) 
    115113        status,xml=ndgRetrieve(uri,self.c,output='original') 
     
    120118                users will need to ensure that the document is actually  
    121119                in your exist database! ''' 
    122          
    123120        self.setup() 
    124121        doc='badc.nerc.ac.uk__NDG-B0__activity_activity_cwvc' 
    125         doc='neodc.nerc.ac.uk__NDG-B1__NEODC_NCAVEO_LCM2000' 
     122        doc='neodc.nerc.ac.uk__NDG-B1__dataent_11924879127625221' 
    126123        uri=ndgObject.ndgObject(doc) 
    127124        status,xml=ndgRetrieve(uri,self.c) 
     
    130127    def testNoSOAP(self): 
    131128        ''' Test that we get a sensible error if a DIF doesn't exist ''' 
    132          
    133129        self.setup() 
    134130        doc='badc.nerc.ac.uk__DIF__blah' 
     
    139135    def testNoB(self): 
    140136        ''' Test that we get a sensible error if a NDG-B doc doesn't exist ''' 
    141          
    142137        self.setup() 
    143138        doc='badc.nerc.ac.uk__NDG-B0__blah' 
     
    159154        ''' Attempt a remote get ''' 
    160155        self.setup() 
    161         doc='www.npm.ac.uk__NDG-B1__data_entity.692' 
     156        doc='www.npm.ac.uk__NDG-B1__data_entity.363' 
    162157        uri=ndgObject.ndgObject(doc) 
    163158        status,xml=ndgRetrieve(uri,self.c,remote=1) 
    164         if not status: print xml 
     159        if not status: print xml #ie print error message if there is one! 
    165160        self.assertEqual(status,1) 
    166161         
     
    169164        self.setup() 
    170165        doc='badc.nerc.ac.uk__NumSim__HadAM2_CodeBase' 
     166        doc='badc.nerc.ac.uk__NumSim__HadGEM1_Control_Experiment' 
    171167        uri=ndgObject.ndgObject(doc) 
    172168        status,xml=ndgRetrieve(uri,self.c) 
    173         print status,xml 
     169        self.assertEqual(status,1) 
     170         
     171    def testHTTPget(self): 
     172        ''' Try a remote get with no frills''' 
     173        s='http://www.google.co.uk' 
     174        x=DocumentRetrieve.genericHTTP(proxyServer='http://wwwcache3.rl.ac.uk:8080/') 
     175        y=x.get(s) 
     176         
     177    def testVocabServer(self): 
     178        ''' Test the vocabServer ''' 
     179        v=DocumentRetrieve.ndgVocabPOX(proxyServer="http://wwwcache3.rl.ac.uk:8080/") 
     180        print v.getRelated('rain') 
     181         
     182         
    174183         
    175184         
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/results.kid

    r2882 r3069  
    2323            <div id="context"> 
    2424                ${c.state.hits} results for ${c.state.searchString} (${XML(c.state.constraints)})</div> 
    25             <div id="SemanticSearchBox"/> 
    26              
     25            <div id="SemanticSearchBox"><div id="SemanticSearchResults"> 
     26                <div py:if="c.state.searchString!=''"> 
     27                Not found what you are looking for? Try ${XML(h.link_to_remote("Alternative Searches",dict(update="SemanticSearchBox", 
     28                        url='%s?%s'%(h.url_for(action='semantic'),c.querystring))))}. 
     29                </div></div> 
     30            </div> 
    2731            <?python 
    2832            n,p=c.state.getNext() 
     
    3236            ?> 
    3337            <div class="resultsBar">  
    34                  <div class="resultsLeft"> 
    35                     ${XML(h.link_to_remote("Semantic Search",dict(update="SemanticSearchBox", 
    36                             url='%s?%s'%(h.url_for(action='semantic'),c.querystring))))} 
    37                     <span py:replace="helpIcon('semser_help')"/> 
    38                  </div> 
    39                  <div> 
    40                  <a href="${c.state.constrainedurl}"> Refine Search</a><span py:replace="helpIcon('refser_help')"/> 
    41                 | Found ${c.state.hits} | Showing ${c.state.offset}-$upper  
    42                   <span py:if="p!=[]"> | <a href="$purl"> Previous ${p[1]}</a> </span> 
    43                   <span py:if="n!=[]"> | <a href="$nurl"> Next ${n[1]}</a></span> | </div> 
    44                 <div id="semser_help" class="hidden"> 
    45                     <div class="helptxt"><p> 
    46                     The semantic search option allows you to see how many hits a search using your current parameters would return if you 
    47                     used a slightly different vocabulary in your search term. 
    48                     </p></div> 
    49                 </div> 
    50                 <div id="refser_help" class="hidden"> 
     38                <div> 
     39                    <a href="${c.state.constrainedurl}"> Refine Search</a><span py:replace="helpIcon('refser_help')"/> 
     40                    | Found ${c.state.hits} | Showing ${c.state.offset}-$upper  
     41                    <span py:if="p!=[]"> | <a href="$purl"> Previous ${p[1]}</a> </span> 
     42                    <span py:if="n!=[]"> | <a href="$nurl"> Next ${n[1]}</a></span> |  
     43                </div><div id="refser_help" class="hidden"> 
    5144                    <div class="helptxt"><p> 
    5245                    The refined search option allows you to constrain your search by returning you to the advanced search page, but retaining your current search parameters 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/semantic.kid

    r2763 r3069  
    22    <body> 
    33        <div id="SemanticSearchResults"> 
    4          Semantic Search not yet implemented ($c.constraints) 
     4            <span py:if="c.narrower!=[] or c.broader!=[]">You could also try </span> 
     5            <span py:if="c.narrower !=[]">  
     6                narrower search(s): <span py:for="i,url in c.narrower"><a href="$url">$i</a>&nbsp;</span> 
     7            </span> 
     8            <span py:if="c.narrower !=[] and c.broader!=[]">;</span> 
     9            <span py:if="c.broader !=[]">  
     10                broader search(s): <span py:for="i,url in c.broader"><a href="$url">$i</a>&nbsp;</span> 
     11            </span> 
     12            <span py:if="c.narrower==[] and c.broader==[]">No alternatives available</span> 
    513        </div> 
    614    </body> 
Note: See TracChangeset for help on using the changeset viewer.