近年來,全文搜索引擎在互聯(lián)網(wǎng)公司中得到了廣泛應(yīng)用。Mysql作為常用的數(shù)據(jù)庫之一,結(jié)合Lucene全文搜索引擎可以更加方便高效地實現(xiàn)全文搜索。
#1.新建索引庫 def search_index(model, id): """ 新建索引庫 """ obj = model.objects.filter(id=id).first() if not obj: logger.error('Cannot find {} object with id={}'.format( model.__name__, id) ) return payload = obj.to_search_dict() payload['_id'] = obj.id payload['_type'] = model.__name__ payload['_index'] = obj.__class__.__name__.lower() es.index( index=payload['_index'], doc_type=payload['_type'], id=payload['_id'], body=payload, refresh=True, )
上述代碼是新建索引庫的Python函數(shù),通過從數(shù)據(jù)庫中查詢數(shù)據(jù),再將數(shù)據(jù)轉(zhuǎn)成字典形式,存入ES的索引庫中。由于查詢數(shù)據(jù)及索引庫的性質(zhì),使用Python語言做處理。
#2.搜索指定關(guān)鍵字 def search(keyword, page=1, per_page=10, filter_path=None): """ 簡單的搜索,可以添加過濾選項 """ dsl = { 'query': { 'multi_match': { 'query': keyword, 'fields': ['title', 'content'], } }, 'highlight': { 'fields': { 'title': {}, 'content': {}, } }, 'from': (page-1) * per_page, 'size': per_page, } if filter_path: dsl['_source'] = { 'include': filter_path, } res = es.search(body=dsl) return res
上述代碼為搜索關(guān)鍵字的Python函數(shù),不同于新建索引庫的函數(shù),搜索需要ES的全文搜索引擎來實現(xiàn)。Dsl是ES提供的高級查詢語言,可以建立復(fù)雜的過濾條件與查詢條件。相比于傳統(tǒng)MySQL的like語句,效率更快。
相信使用Mysql與Lucene結(jié)合的全文搜索引擎能夠更好的滿足互聯(lián)網(wǎng)公司的需求,提高數(shù)據(jù)查詢效率。
上一篇mysql lur
下一篇mysql luix