Whooshalchemyplus 加 jieba 實現flask支持中文全文搜索

首先flask支持全文搜索的模塊目前用的比較多的只有whooshalchemy以及whooshalchemyplus兩個,不過都僅僅支持英文全文搜索,中文的話需要先進行分詞處理,然後才能夠使用whooshalchemyplus搜到,而中文分詞在pyhton中莫過於jieba(做最好的 Python 中文分詞組件)。

    最近使用flask建站時,一直找不到有效的中文全文搜索方法,網上這方面的資料也比較少,並且有效的就更捉急了,參考了網上的一些說法加上自己的摸索,最終找到了行之有效的實現方式,現在記錄下來。

一、安裝

 


 
  1. pip install flask_whooshalchemyplus

  2.  
  3. pip install jieba

 

flask_whooshalchemyplus資料: https://pypi.python.org/pypi/Flask-WhooshAlchemyPlus/0.7.5

jieba資料: https://pypi.python.org/pypi/jieba/

 

二、使用

1.(app/__init__.py初始化文件)

    (1). 導入flask_whooshalchemyplus用來建立搜索

 

    import flask_whooshalchemyplus

 

    (2).然後在工廠函數create_app中進行初始化app, 即

 

    flask_whooshalchemyplus.init_app(app)

 

2.(app/models.py模板文件)

    導入 jieba, 用來中文分詞 

    from jieba.analyse.analyzer import ChineseAnalyzer

 

   在Post類中添加:

 


 
  1. __searchable__ = ['body', 'title']

  2. __analyzer__ = ChineseAnalyzer()

       以便進行文章標題及內容的修改。

 

3.(app/main/view.py視圖文件)

    (1). 在視圖函數index()中判斷是否有表單提交中最後添加:

 

    flask_whooshalchemyplus.index_one_model(Post)

        用來將每一次的提交加入索引

 

    (2). 新添加兩個路由函數:(搜索及搜索結果)

 


 
  1. @main.route('/search', methods = ['POST'])

  2. def search():

  3. if not request.form['search']:

  4. return redirect(url_for('.index'))

  5. return redirect(url_for('.search_results', query = request.form['search']))

  6.  
  7.  
  8. @main.route('/search_results/<query>')

  9. def search_results(query):

  10. results = Post.query.whoosh_search(query).all()

  11. return render_template('search_results.html', query = query, results = results)

 

 4. (前端)

    (1). 在base.html的導航欄中添加搜索框:

 


 
  1. <div class="col-lg-4">

  2. {% if current_user %}

  3. <form class="navbar-form navbar-left" action="{{url_for('main.search')}}" method="POST">

  4. <div class="form-group">

  5. <input type="text" class="form-control" placeholder="站內搜索" name="search" >

  6. </div>

  7. <button type="submit" class="btn btn-default">搜索</button>

  8. </form>

  9. {% endif %}

  10. </div>

 

    (2). search_results.html文件

 


 
  1. {% extends "base.html" %}

  2. {% block title %}Searching{% endblock %}

  3.  
  4. {% block page_content %}

  5. <div class="page-header">

  6. <h1>搜索關鍵詞: "{{query}}"</h1>

  7. </div>

  8. <ul class="posts">

  9. {% for post in results %}

  10. <li class="post">

  11. <div class="post-content">

  12. <div class="post-date">{{ moment(post.timestamp).fromNow() }}</div>

  13. <div class="post-author"><a href="{{ url_for('.user', username=post.author.username) }}">{{ post.author.username }}</a></div>

  14. <div class="post-body">

  15. {% if post.body_html %}

  16. {{ post.body_html | safe }}

  17. {% else %}

  18. {{ post.body }}

  19. {% endif %}

  20. </div>

  21. <div class="post-footer">

  22. <a href="{{ url_for('.post', id=post.id) }}">

  23. <span class="label label-success">詳情</span>

  24. </a>

  25. <a href="{{ url_for('.post', id=post.id) }}#comments">

  26. <span class="label label-primary">{{ post.comments.count() }} 評論</span>

  27. </a>

  28. </div>

  29. </div>

  30. </li>

  31. {% endfor %}

  32. </ul>

  33. {% endblock %}

  34.  

到這裏基本已經完成了。 

 

三、效果

1. 頁面:搜索框

 

 

2.中文搜索結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章