Пример #1
0
    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
Пример #2
0
    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()
Пример #3
0
 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()
Пример #4
0
 def __enter__(self):
     dirpath = TempDir.__enter__(self)
     store = FileStorage(dirpath)
     self.onexit = lambda: store.close()
     return store