honmaple 8 лет назад
Родитель
Сommit
43c5a87d8d

+ 3 - 2
forums/__init__.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2017-01-25 20:10:50 (CST)
 # Created: 2017-01-25 20:10:50 (CST)
-# Last Update:星期日 2017-4-9 12:8:22 (CST)
+# Last Update:星期六 2017-4-15 22:50:0 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************
@@ -63,6 +63,7 @@ def register_extension(app):
         module='forums.extension.',
         module='forums.extension.',
         extension=['db', 'avatar', 'cache', 'csrf', 'bootstrap', 'captcha',
         extension=['db', 'avatar', 'cache', 'csrf', 'bootstrap', 'captcha',
                    'error', 'redis_data', 'principal', 'babel',
                    'error', 'redis_data', 'principal', 'babel',
-                   'login_manager', 'maple_app', 'mail', 'middleware'])
+                   'login_manager', 'maple_app', 'mail', 'middleware',
+                   'search'])
     extension.init_app(app)
     extension.init_app(app)
     admin.init_app(app)
     admin.init_app(app)

+ 18 - 9
forums/api/search/views.py

@@ -6,22 +6,31 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2017-03-31 17:26:28 (CST)
 # Created: 2017-03-31 17:26:28 (CST)
-# Last Update:星期五 2017-3-31 17:48:23 (CST)
+# Last Update:星期日 2017-4-16 15:4:55 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************
-from flask import request
+from flask import request, render_template
 from forums.common.views import BaseMethodView as MethodView
 from forums.common.views import BaseMethodView as MethodView
 from forums.api.topic.models import Topic
 from forums.api.topic.models import Topic
+from forums.extension import search
 
 
 
 
 class SearchView(MethodView):
 class SearchView(MethodView):
     def get(self):
     def get(self):
         query_dict = request.data
         query_dict = request.data
-        search = query_dict.pop('key', None)
-        results = Topic.query.whoosh_search('第一').all()
-        print(results)
-        return ''
-
-    def post(self):
-        pass
+        keyword = query_dict.pop('keyword', None)
+        include = query_dict.pop('include', '0')
+        if keyword and len(keyword) >= 2:
+            fields = None
+            if include == '0':
+                fields = ['title', 'content']
+            elif include == '1':
+                fields = ['title']
+            elif include == '2':
+                fields = ['content']
+            results = search.whoosh_search(Topic, keyword, fields=fields)
+            data = {'title': 'Search', 'results': results, 'keyword': keyword}
+            return render_template('search/result.html', **data)
+        data = {'title': 'Search'}
+        return render_template('search/search.html', **data)

+ 1 - 1
forums/api/topic/models.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 20:52:07 (CST)
 # Created: 2016-12-15 20:52:07 (CST)
-# Last Update:星期日 2017-4-2 16:57:5 (CST)
+# Last Update:星期日 2017-4-16 11:39:48 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************

+ 3 - 4
forums/api/urls.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2017-01-25 20:12:58 (CST)
 # Created: 2017-01-25 20:12:58 (CST)
-# Last Update:星期六 2017-4-1 18:45:19 (CST)
+# Last Update:星期日 2017-4-16 13:59:3 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************
@@ -20,8 +20,7 @@ from .follow.urls import site as follow_site
 from .upload.urls import site as upload_site
 from .upload.urls import site as upload_site
 from .collect.urls import site as collect_site
 from .collect.urls import site as collect_site
 from .message.urls import site as message_site
 from .message.urls import site as message_site
-
-# from .search.urls import site as search_site
+from .search.urls import site as search_site
 # from .permission.urls import site as perm_site
 # from .permission.urls import site as perm_site
 
 
 
 
@@ -36,5 +35,5 @@ def api_routers(app):
     app.register_blueprint(upload_site)
     app.register_blueprint(upload_site)
     app.register_blueprint(collect_site)
     app.register_blueprint(collect_site)
     app.register_blueprint(message_site)
     app.register_blueprint(message_site)
-    # app.register_blueprint(search_site)
     # app.register_blueprint(perm_site)
     # app.register_blueprint(perm_site)
+    app.register_blueprint(search_site)

+ 3 - 1
forums/extension.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2016-10-25 21:57:10 (CST)
 # Created: 2016-10-25 21:57:10 (CST)
-# Last Update:星期六 2017-4-1 21:31:33 (CST)
+# Last Update:星期日 2017-4-16 13:58:45 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************
@@ -28,6 +28,7 @@ from flask_maple.mail import Mail
 from flask_cache import Cache
 from flask_cache import Cache
 from flask_principal import Principal
 from flask_principal import Principal
 from flask_login import LoginManager
 from flask_login import LoginManager
+from flask_search import Search
 import os
 import os
 
 
 
 
@@ -100,3 +101,4 @@ principal = Principal()
 login_manager = register_login()
 login_manager = register_login()
 maple_app = App(json=CustomJSONEncoder)
 maple_app = App(json=CustomJSONEncoder)
 middleware = Middleware()
 middleware = Middleware()
+search = Search()

+ 60 - 1
manager.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2016-10-25 22:08:39 (CST)
 # Created: 2016-10-25 22:08:39 (CST)
-# Last Update:星期日 2017-4-2 16:44:25 (CST)
+# Last Update:星期日 2017-4-16 13:54:53 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************
@@ -26,6 +26,65 @@ manager = Manager(app)
 
 
 
 
 @manager.command
 @manager.command
+def index():
+    from forums.extension import search
+    return search.create_index()
+
+
+@manager.command
+def ss():
+    from forums.extension import search
+    from forums.api.topic.models import Topic
+    results = search.whoosh_search(Topic, '河海大学', ['title'], 3)
+    print('results:')
+    print(results)
+    for i in results:
+        print(i)
+        print(i.highlights("title"))  # 高亮标题中的检索词
+
+
+@manager.command
+def test():
+    from forums.extension import search
+    from whoosh.index import open_dir
+    from whoosh.index import create_in
+    from whoosh.fields import Schema, TEXT, ID
+    from jieba.analyse import ChineseAnalyzer
+    from forums.api.topic.models import Topic
+    analyzer = ChineseAnalyzer()
+
+    # 创建schema, stored为True表示能够被检索
+    schema = search._schema(Topic)
+    ix = search._index(Topic)
+    # schema = Schema(
+    #     title=TEXT(
+    #         stored=True, analyzer=analyzer),
+    #     id=ID(stored=False),
+    #     content=TEXT(
+    #         stored=True, analyzer=analyzer))
+    # 存储schema信息至'indexdir'目录下
+    # indexdir = 'whoosh_index/Topic'
+    # if not os.path.exists(indexdir):
+    #     os.mkdir(indexdir)
+    # ix = create_in(indexdir, schema)
+    # ix = open_dir(indexdir)
+    writer = ix.writer()
+    instances = Topic.query.enable_eagerloads(False).yield_per(100)
+    for instance in instances:
+        print(instance)
+        writer.add_document(
+            title=instance.title,
+            id=str(instance.id),
+            content=instance.content)
+    writer.commit()
+    searcher = ix.searcher()
+    results = searcher.find("title", "河海大学")
+    print(results)
+    for i in results:
+        print(i)
+
+
+@manager.command
 def runserver():
 def runserver():
     return app.run()
     return app.run()
 
 

+ 1 - 1
runserver.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Email: xiyang0807@gmail.com
 # Created: 2016-10-25 22:01:29 (CST)
 # Created: 2016-10-25 22:01:29 (CST)
-# Last Update:星期六 2017-4-1 23:10:12 (CST)
+# Last Update:星期六 2017-4-15 20:38:39 (CST)
 #          By:
 #          By:
 # Description:
 # Description:
 # **************************************************************************
 # **************************************************************************

+ 3 - 3
templates/base/header.html

@@ -1,5 +1,5 @@
 {% macro navlist(url,title) -%}
 {% macro navlist(url,title) -%}
-<li><a href="{{ url }}">{{ title }}</a></li>
+  <li><a href="{{ url }}">{{ title }}</a></li>
 {%- endmacro %}
 {%- endmacro %}
 
 
 <nav class="navbar navbar-default navbar-fixed-top" style="background:#fff">
 <nav class="navbar navbar-default navbar-fixed-top" style="background:#fff">
@@ -21,9 +21,9 @@
         {{ navlist('http://honmaple.org',_('Blog')) }}
         {{ navlist('http://honmaple.org',_('Blog')) }}
         {{ navlist(url_for('topic.good'),_('Good')) }}
         {{ navlist(url_for('topic.good'),_('Good')) }}
       </ul>
       </ul>
-      <form onsubmit="return dispatch()" class="navbar-form navbar-right" style="margin-top:10px;" >
+      <form action="{{ url_for('search.search') }}" class="navbar-form navbar-right" style="margin-top:10px;" >
         <div class="form-group has-feedback">
         <div class="form-group has-feedback">
-          {{ g.search_form.search(class="form-control input-sm",placeholder=_("search content")) }}
+          <input class="form-control input-sm" name="keyword" placeholder="搜索内容" type="text" value="">
           <i class="fa fa-search form-control-feedback"></i>
           <i class="fa fa-search form-control-feedback"></i>
         </div>
         </div>
       </form>
       </form>

+ 14 - 0
templates/search/form.html

@@ -0,0 +1,14 @@
+<form class="form-inline text-center" action="{{ url_for('search.search') }}">
+  <div class="input-group">
+    <div class="input-group-addon">关键字:</div>
+    <input type="text" class="form-control" name="keyword" placeholder="搜索关键字">
+    <div class="input-group-addon" style="padding:0px;border:none;">
+      <select name="include" class="form-control" style="border-left-style:none;">
+        <option value="0">包含标题和内容</option>
+        <option value="1">仅搜索标题</option>
+        <option value="2">仅搜索内容</option>
+      </select>
+    </div>
+  </div>
+  <button type="submit" class="btn btn-primary" style="width:120px;">搜索</button>
+</form>

+ 21 - 0
templates/search/result.html

@@ -0,0 +1,21 @@
+{% extends 'base/base.html' %}
+{% block content %}
+  {{ breadcrumb(hrefs={_('Search'):url_for('search.search')},active=keyword)}}
+  <div class="panel panel-primary">
+    <div class="panel-heading">
+      {{ _('Search') }}
+    </div>
+    <div class="panel-body" style="border-bottom:1px solid #eee">
+      {% include "search/form.html" %}
+    </div>
+    {% for result in results %}
+      <div class="panel-body text-center" style="padding:6px;border-bottom:1px solid #eee">
+        <a href="{{ url_for('topic.topic',topicId=result['id']) }}">{{ result['title'] }}</a>
+      </div>
+    {% else %}
+      <div class="panel-body text-center">
+        您的搜索没有返回结果。
+      </div>
+    {% endfor %}
+  </div>
+{% endblock %}

+ 14 - 0
templates/search/search.html

@@ -0,0 +1,14 @@
+{% extends 'base/base.html' %}
+{% block content %}
+  {{ breadcrumb(active=_('Search')) }}
+  {% cache 300 %}
+    <div class="panel panel-primary">
+      <div class="panel-heading">
+        {{ _('Search') }}
+      </div>
+      <div class="panel-body">
+        {% include "search/form.html" %}
+      </div>
+    </div>
+  {% endcache %}
+{% endblock %}