[Python] python对xapian的一个简单封装类 →→→→→进入此内容的聊天室

来自 , 2020-07-09, 写在 Python, 查看 100 次.
URL http://www.code666.cn/view/0e98aeeb
  1. import xapian, config
  2. from mmseg.search import seg_txt_2_dict
  3.  
  4. class Xapian():
  5.     """xapian search class """
  6.  
  7.     def __init__(self):
  8.         """init xapian search class
  9.        :returns: class
  10.  
  11.        """
  12.         self.db = xapian.WritableDatabase(config.xapian_index_dir, xapian.DB_CREATE_OR_OPEN)
  13.         self.enquire = xapian.Enquire(self.db)
  14.         self.enquire.set_sort_by_value(1, True)
  15.  
  16.     def get_document(self, id):
  17.         """获取doc
  18.  
  19.        :id: id
  20.        :returns: Document
  21.  
  22.        """
  23.         return self.db.get_document(id)
  24.  
  25.     def delete_document(self,id):
  26.         """删除索引
  27.  
  28.        :id: 索引id
  29.        """
  30.         try:
  31.             return self.db.delete_document(id)
  32.         except:
  33.             return None
  34.  
  35.     def update_index(self, id, text=None, values=None, data=None):
  36.         """更新索引
  37.  
  38.        :id: 要替换的id
  39.        :doc: 新的doc
  40.        """
  41.         try:
  42.             doc = self.get_document(id)
  43.         except:
  44.             return False
  45.  
  46.         if text:
  47.             doc.clear_terms()#清除terms
  48.             for word, value in seg_txt_2_dict(text).iteritems():
  49.                 doc.add_term(word)
  50.  
  51.         if values:
  52.             doc.clear_values()
  53.             for key, value in values.iteritems():
  54.                 doc.add_value(key, value)
  55.  
  56.         if data:
  57.             doc.set_data(data)
  58.  
  59.         try:
  60.             self.db.replace_document(id, doc)
  61.             return True
  62.         except:
  63.             return False
  64.  
  65.     def index(self, id, text, values={}, data=''):
  66.         """index to xapian
  67.  
  68.        :id: data id
  69.        :text: search content is utf-8
  70.        :returns: boolean
  71.  
  72.        """
  73.         doc = xapian.Document()
  74.         for word, value in seg_txt_2_dict(text).iteritems():
  75.             print word, value
  76.             doc.add_term(word)
  77.  
  78.         #添加value用于排序,key似乎只能是数字
  79.         for key, value in values.iteritems():
  80.             doc.add_value(key, value)
  81.  
  82.         if data:
  83.             doc.set_data(data)
  84.  
  85.         try:
  86.             self.db.replace_document(id, doc)
  87.             return True
  88.         except:
  89.             return False
  90.  
  91.     def search(self, keywords, offset=0, limit=10):
  92.         """search xapian
  93.  
  94.        :keywords: 搜索的关键字
  95.        :offset: 起始位置
  96.        :limit: 结束位置
  97.        :returns: matches对象
  98.  
  99.        """
  100.         query_list = []
  101.         for word, value in seg_txt_2_dict(keywords.encode('utf-8')).iteritems():
  102.             query = xapian.Query(word)
  103.             query_list.append(query)
  104.  
  105.         if len(query_list) != 1:
  106.             query = xapian.Query(xapian.Query.OP_AND, query_list)
  107.         else:
  108.             query = query_list[0]
  109.  
  110.         self.enquire.set_query(query)
  111.         matches = self.enquire.get_mset(offset, limit, 10000)
  112.         return matches
  113.  
  114.     def flush(self):
  115.         """flush to disk
  116.        :returns: flush结果
  117.  
  118.        """
  119.         return self.db.flush()
  120.  
  121. search = Xapian()
  122. #//python/8953

回复 "python对xapian的一个简单封装类"

这儿你可以回复上面这条便签

captcha