1. 使用全文搜索框架django-haystack

2. 使用搜索引擎whoosh

3. 安装

  pip install django-haystack

  pip install whoosh

4. 配置

settings.py中
INSTALLED_APPS = [
  ...
    'haystack',
    'app01',
]
# 全文检索框架配置
HAYSTACK_CONNECTIONS = {
    'default': {
        # whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}

# 当添加,修改,删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

5. 文件生成

  1. 在app文件夹下建立一个py文件,文件名是固定的search_indexes.py

from haystack import indexes
# 导入该app下的模型类
from goods.models import GoodsSKU


# 指定对于某个类的某些数据(字段)建立索引
# 索引类名格式:模型类名+Index
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
    # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        # 返回你的模型类
        return GoodsSKU

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

 

goods/goodssku_text.txt,写入以下内容

    其中标红的两个名字一个是app名称,一个是模型类名小写加_text,路径及文件名也是固定的

# 指定根据表中的哪些字段建立索引数据
# {{ object.字段名 }} ,接受跨表字段名
{{ object.name }}  # 根据商品的名称建立索引
{{ object.desc }}  # 根据商品的简介建立索引
{{ object.goods.detail }}  # 根据商品的详情建立索引

终端运行python manage.py rebuild_index. 此时就会生成一个新文件夹,可以尝试

 

6. 使用全文检索

  1. 前端页面提交表单到一个url中进行处理,建议url设置为/search

 

get请求,请求地址为/search

<div class="search_con fl">
            <form method="get" action="/search">
                <input type="text" class="input_text fl" name="q" placeholder="搜索商品">
                <input type="submit" class="input_btn fr" name="" value="搜索">
            </form>
        </div>

 

 

 

  2. 配置url

 

固定写法,当有请求发送过来是,交给haystack.urls进行处理

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^tinymce/', include('tinymce.urls')),
    url(r'^search', include('haystack.urls')),  # 加入这一行
  ...
]

 

 

  3.  请求的返回结果

当请求传达给haystack后,Haystack会把搜索出的结果传递给templates/search下的search.html(需要手动创建)
①传递的上下文包括:
1)query:搜索关键字
2)page: 当前页的page对象-->遍历page对象,获取到的是SearchResult类的实例对象,对象的属性object才是模型类的对象
3)paginator:分页paginator对象,
4)通过在settings.py中设置HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1 可以控制每页显示数量

 

7. 前端显示(这里还没有弄明白)

<ul class="goods_type_list clearfix">

                {% for res in page %}

                <li>
                    <a href="{% url 'goods:detail' res.object.id %}"><img src="{{ res.object.image.url }}"></a>
                    <h4><a href="{% url 'goods:detail' res.object.id %}">{{ res.object.name }}</a></h4>
                    <div class="operate">
                        <span class="prize">¥{{ res.object.price }}</span>
                        <span class="unit">{{ res.object.price }}/{{ res.object.unite }}</span>
                        <a href="#" class="add_goods" title="加入购物车"></a>
                    </div>
                </li>

                {% endfor %}

            </ul>

            <div class="pagenation">
                {% if page.has_previous %}
                    <a href="/search?q={{ query }}&page={{ page.previous_page_number }}">上一页</a>
                {% endif %}

                {% for pindex in paginator.page_range %}
                    {% if pindex == page.number %}
                        <a href="/search?q={{ query }}&page={{ pindex }}" class="active">{{ pindex }}</a>
                        {% else %}
                        <a href="/search?q={{ query }}&page={{ pindex }}">{{ pindex }}</a>
                    {% endif %}

                {% endfor %}


                {% if page.has_next %}
                    <a href="/search?q={{ query }}&page={{ page.next_page_number }}">下一页></a>
                {% endif %}

            </div>

 

 

8. 使用jieba分词,效果比haystark默认的要好很多

pip install jieba

# 然后在文件夹/python路径/lib/python2.7.5/site-packages/haystack/backends/whoosh_backend.py ,
将里面的whoosh_backend.py复制一份还在此文件夹下,改名为whoosh_cn_backend.py,并修改两行代码

from jieba.analyse import ChineseAnalyzer #在顶部添加

schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(),field_boost=field_class.boost, sortable=True) #找到这个然后修改,大概在160行

 

# 然后在settings.py中修改配置

# 全文检索框架配置
HAYSTACK_CONNECTIONS = {
    'default': {
        # whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}