def classify(self): "method attempts to classify a Work as either an existing or new work" if self.entity_info.has_key('title'): # Searches Redis redis_title = self.entity_info['title'] # Returns a label if redis_title is a bf:TitleEntity title_label = self.redis_datastore.hget( redis_title, 'label') if title_label is None: # Sets by retrieving the literal title value title_label = redis_title if title_label is not None: cw_title_keys = search_title(title_label, self.redis_datastore) for creative_wrk_key in cw_title_keys: if not creative_wrk_key.startswith( 'bf:{0}'.format(self.work_class.name)): continue if self.redis_datastore.hexists(creative_wrk_key, 'associatedAgent'): creator_keys = set([ self.redis_datastore.hget(creative_wrk_key, 'associatedAgent')]) else: creator_keys = self.redis_datastore.smembers( "{0}:associatedAgent".format(creative_wrk_key)) if self.entity_info.has_key('rda:isCreatedBy'): if self.strict is True: existing_keys = creator_keys.intersection(self.entity_info['rda:isCreatedBy']) else: existing_keys = creator_keys.union(self.entity_info['rda:isCreatedBy']) if len(existing_keys) == 1: msg = "{0} MATCHED {1} to {2}".format( datetime.datetime.utcnow().isoformat(), creative_wrk_key, self.entity_info.get('title')) logger.info(msg) self.creative_work = self.work_class(redis_datastore=self.redis_datastore, redis_key=creative_wrk_key) if not self.creative_work: self.creative_work = self.work_class(redis_datastore=self.redis_datastore) for key, value in self.entity_info.iteritems(): setattr(self.creative_work, key, value) self.creative_work.save() else: print("Entity does not have a title {0}".format(self.entity_info)) self.redis_datastore.sadd('no-titles', self.redis_datastore.get('simple-classifier')) self.redis_datastore.incr('simple-classifier')
def search(request): """ JSON Ajax view, accepts a query and returns the results from searching RDA Title Redis datastore instance. :param request: HTTP Request :param rtype: JSON encoded string """ results = [] raw_title = request.REQUEST.get('q') if raw_title is not None: search_results = redis_helpers.search_title(raw_title,work_redis) if len(search_results) > 0: for work_key in search_results: raw_results = work_redis.hgetall(work_key) for k,v in raw_results.iteritems(): raw_results[k] = v.encode('utf8','replace') raw_results["bibframe_work"] = work_key raw_results['search_prefix'] = raw_title preferred_title = unicode(work_redis.hget("{0}:rda:Title".format(work_key), 'rda:preferredTitleForTheWork'), errors="replace") for word in raw_title.split(" "): if preferred_title.count(word) > 0: preferred_title = preferred_title.replace(word,'''<span style="background-color:yellow">{0}</span>'''.format(word)) raw_results['title'] = preferred_title raw_results['ils-bib-numbers'] = [] for instance_key in list(work_redis.smembers("{0}:bibframe:Instances".format(work_key))): raw_results['ils-bib-numbers'].append(instance_redis.hget("{0}:rda:identifierForTheManifestation".format(instance_key), 'ils-bib-number')) creator_keys = work_redis.smembers("{0}:rda:creator".format(work_key)) if len(creator_keys) > 0: raw_results['creator'] = [] creator_keys = list(creator_keys) for creator_key in creator_keys: creator_name = unicode(authority_redis.hget(creator_key, "rda:preferredNameForThePerson"), errors="replace") raw_results['creator'].append(creator_name) results.append(raw_results) return {'q':raw_title,'results':results}
def title(self): # Search using Title App found_titles = title_app.search_title(self.query, self.redis_datastore) for title_key in found_titles: self.__add_to_query__(title_key)