def search(self, searchfield, searchkeyword, ignoretypo=False): storage = FileStorage(self.indexpath) ix = storage.open_index(indexname=self.indexname) if self.advancemode: if isinstance(searchfield, str): searchfield = self.__recreate_field(searchfield) elif isinstance(searchfield, list): newsearchfields = [] for s_field in searchfield: newsearchfields.append(self.__recreate_field(s_field)) searchfield = newsearchfields print(searchfield) if isinstance(searchfield, str): qp = QueryParser(searchfield, schema=self.indexschema, group=OrGroup) elif isinstance(searchfield, list): qp = MultifieldParser(searchfield, schema=self.indexschema) q = qp.parse(searchkeyword) resultobjlist = [] corrected_dict = {} with ix.searcher() as searcher: corrected = searcher.correct_query(q, searchkeyword) if corrected.query != q and ignoretypo == False: q = qp.parse(corrected.string) corrected_dict = {'corrected': u'您要找的是不是' + corrected.string} results = searcher.search(q, limit=None) #results.formatter = BlogFormatter() results.formatter = self.formatter() print(results) for result in results: obj_dict = {} highlightresults = [] for key in result: obj_dict[key] = result[key] if isinstance(searchfield, str): highlightresults.append({ searchfield: '<' + result.highlights(searchfield) + '>' }) elif isinstance(searchfield, list): for _field in searchfield: highlightresults.append( {_field: '<' + result.highlights(_field) + '>'}) obj_dict['highlight'] = highlightresults print(obj_dict['highlight']) extradata_dic = self.extradata() if len(extradata_dic) > 0: obj_dict.update(**extradata_dic) resultobjlist.append(obj_dict) storage.close() return resultobjlist, corrected_dict
def __buildindex(self): #schemadict = self.__buildSchema() document_dic = {} # defaultFolderPath = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'engineindex/') if self.indexschema is None: return False if not os.path.exists(self.indexpath): os.mkdir(self.indexpath) modelSchema = Schema(**self.indexschema) storage = FileStorage(self.indexpath) if not exists_in(self.indexpath, indexname=self.indexname): ix = create_in(self.indexpath, modelSchema, indexname=self.indexname) print('index is created') writer = ix.writer() # 将model对象依次加入index中 objectlist = self.model.objects.all() for obj in objectlist: for key in self.indexschema: if hasattr(obj, key): # print(key,getattr(obj,key.split('.')[-1])) document_dic[key] = getattr(obj, key) else: if self.advancemode: # 该key属于外键 foreignmodel = key.split('_')[0] foreignkey = key[key.find('_') + 1:] for field in self.model._meta.get_fields(): if type(field) == ForeignKey: if field.related_model.__name__ == foreignmodel: print(field.__str__().split('.')[-1]) foreignobj = getattr( obj, field.__str__().split('.')[-1]) if hasattr(foreignobj, foreignkey): print(key) document_dic[key] = getattr( foreignobj, foreignkey) writer.add_document(**document_dic) document_dic.clear() writer.commit() print('all blog has indexed') storage.close()
def updateindex(self): print('updateindex') storage = FileStorage(self.indexpath) ix = storage.open_index(indexname=self.indexname) index_id = set() to_index_id = set() objlist = self.model.objects.all() with ix.searcher() as searcher: writer = AsyncWriter(ix) for indexfield in searcher.all_stored_fields(): if len(indexfield) > 0: indexId = indexfield['id'] print(indexId) index_id.add(indexId) # 数据库未找到此篇,则可能已被删除,故从index中删除此篇 if not self.model.objects.filter(id=indexId): print(indexId) writer.delete_by_term('id', str(indexId)) else: for key in indexfield: # 根据updatefield进行更新 if key == self.updatefield: print(indexId) objfromdb = self.model.objects.get(id=indexId) contentofobj = getattr(objfromdb, self.updatefield) if contentofobj != indexfield[key]: writer.delete_by_term('id', str(indexId)) to_index_id.add(indexId) print('update id is %s, title is %s' % (indexId, objfromdb.title)) for obj in objlist: if obj.id in to_index_id or obj.id not in index_id: self.__addonedoc(writer, obj.id) print('add id is %s, title is %s' % (obj.id, obj.title)) writer.commit() storage.close()
def __enter__(self): dirpath = TempDir.__enter__(self) store = FileStorage(dirpath) self.onexit = lambda: store.close() return store