flask msearch
1.0.0
플라스크-msearch를 설치하려면:
pip install flask-msearch
# when MSEARCH_BACKEND = "whoosh"
pip install whoosh blinker
# when MSEARCH_BACKEND = "elasticsearch", only for 6.x.x
pip install elasticsearch==6.3.1
또는 다음을 수행하여 저장소를 다운로드하고 수동으로 설치할 수 있습니다.
자식 클론 https://github.com/honmaple/flask-msearch
CD 플라스크-msearch
파이썬 setup.py 설치
from flask_msearch import Search
[...]
search = Search ()
search . init_app ( app )
# models.py
class Post ( db . Model ):
__tablename__ = 'post'
__searchable__ = [ 'title' , 'content' ]
# views.py
@ app . route ( "/search" )
def w_search ():
keyword = request . args . get ( 'keyword' )
results = Post . query . msearch ( keyword , fields = [ 'title' ], limit = 20 ). filter (...)
# or
results = Post . query . filter (...). msearch ( keyword , fields = [ 'title' ], limit = 20 ). filter (...)
# elasticsearch
keyword = "title:book AND content:read"
# more syntax please visit https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
results = Post . query . msearch ( keyword , limit = 20 ). filter (...)
return ''
# when backend is elasticsearch, MSEARCH_INDEX_NAME is unused
# flask-msearch will use table name as elasticsearch index name unless set __msearch_index__
MSEARCH_INDEX_NAME = 'msearch'
# simple,whoosh,elaticsearch, default is simple
MSEARCH_BACKEND = 'whoosh'
# table's primary key if you don't like to use id, or set __msearch_primary_key__ for special model
MSEARCH_PRIMARY_KEY = 'id'
# auto create or update index
MSEARCH_ENABLE = True
# logger level, default is logging.WARNING
MSEARCH_LOGGER = logging . DEBUG
# SQLALCHEMY_TRACK_MODIFICATIONS must be set to True when msearch auto index is enabled
SQLALCHEMY_TRACK_MODIFICATIONS = True
# when backend is elasticsearch
ELASTICSEARCH = { "hosts" : [ "127.0.0.1:9200" ]}
from flask_msearch import Search
[...]
search = Search ()
search . init_app ( app )
class Post ( db . Model ):
__tablename__ = 'basic_posts'
__searchable__ = [ 'title' , 'content' ]
id = db . Column ( db . Integer , primary_key = True )
title = db . Column ( db . String ( 49 ))
content = db . Column ( db . Text )
def __repr__ ( self ):
return '<Post:{}>' . format ( self . title )
sqlalchemy ValueError가 발생하는 경우 db 매개변수를 검색에 전달하세요.
db = SQLalchemy ()
search = Search ( db = db )
search.create_index ()
search.create_index(Post)
search . update_index ()
search . update_index ( Post )
# or
search . create_index ( update = True )
search . create_index ( Post , update = True )
search . delete_index ()
search . delete_index ( Post )
# or
search . create_index ( delete = True )
search . create_index ( Post , delete = True )
휙 백엔드에만 해당
from jieba . analyse import ChineseAnalyzer
search = Search ( analyzer = ChineseAnalyzer ())
또는 특수 모델의 경우 __msearch_analyzer__
사용하세요.
class Post ( db . Model ):
__tablename__ = 'post'
__searchable__ = [ 'title' , 'content' , 'tag.name' ]
__msearch_analyzer__ = ChineseAnalyzer ()
일부 모델에 대해 특수 인덱스 이름을 설정하려는 경우.
class Post ( db . Model ):
__tablename__ = 'post'
__searchable__ = [ 'title' , 'content' , 'tag.name' ]
__msearch_index__ = "post111"
from whoosh . fields import ID
class Post ( db . Model ):
__tablename__ = 'post'
__searchable__ = [ 'title' , 'content' , 'tag.name' ]
__msearch_schema__ = { 'title' : ID ( stored = True , unique = True ), 'content' : 'text' }
참고: hybrid_property
사용하는 경우 특별하게 __msearch_schema__
설정하지 않는 한 기본 필드 유형은 Text
입니다.
from whoosh . qparser import MultifieldParser
class Post ( db . Model ):
__tablename__ = 'post'
__searchable__ = [ 'title' , 'content' ]
def _parser ( fieldnames , schema , group , ** kwargs ):
return MultifieldParser ( fieldnames , schema , group = group , ** kwargs )
__msearch_parser__ = _parser
참고: MSEARCH_BACKEND
의 경우에만 whoosh
플라스크-msearch는 기본적으로 플라스크 신호를 사용하여 인덱스를 업데이트합니다. celey와 같은 다른 비동기 도구를 사용하여 인덱스를 업데이트하려면 특수 MSEARCH_INDEX_SIGNAL
설정하십시오.
# app.py
app . config [ "MSEARCH_INDEX_SIGNAL" ] = celery_signal
# or use string as variable
app . config [ "MSEARCH_INDEX_SIGNAL" ] = "modulename.tasks.celery_signal"
search = Search ( app )
# tasks.py
from flask_msearch . signal import default_signal
@ celery . task ( bind = True )
def celery_signal_task ( self , backend , sender , changes ):
default_signal ( backend , sender , changes )
return str ( self . request . id )
def celery_signal ( backend , sender , changes ):
return celery_signal_task . delay ( backend , sender , changes )
예를 들어
class Tag ( db . Model ):
__tablename__ = 'tag'
id = db . Column ( db . Integer , primary_key = True )
name = db . Column ( db . String ( 49 ))
class Post ( db . Model ):
__tablename__ = 'post'
__searchable__ = [ 'title' , 'content' , 'tag.name' ]
id = db . Column ( db . Integer , primary_key = True )
title = db . Column ( db . String ( 49 ))
content = db . Column ( db . Text )
# one to one
tag_id = db . Column ( db . Integer , db . ForeignKey ( 'tag.id' ))
tag = db . relationship (
Tag , backref = db . backref (
'post' , uselist = False ), uselist = False )
def __repr__ ( self ):
return '<Post:{}>' . format ( self . title )
태그 모델에 msearch_FUN을 추가해야 합니다. 그렇지 않으면 tag.name 이 자동 업데이트될 수 없습니다.
class Tag ....
......
def msearch_post_tag ( self , delete = False ):
from sqlalchemy import text
sql = text ( 'select id from post where tag_id=' + str ( self . id ))
return {
'attrs' : [{
'id' : str ( i [ 0 ]),
'tag.name' : self . name
} for i in db . engine . execute ( sql )],
'_index' : Post
}