Elasticsearch介绍 实现全文检索的搜索引擎,首选的是Elasticsearch。 Elasticsearch 是用 Java 实现的,开源的搜索引擎。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github等都采用它。 Elasticsearch 的底层是开源库 Lucene。但是,没法直接使用 Lucene,必须自己写代码去调用它的接口。
分词说明 1.集成Elasticsearch1.1. Haystack介绍和安装配置Haystack安装 $ pip install django-haystack
$ pip install elasticsearchHaystack注册应用和路由 在django的配置文件中注册。 INSTALLED_APPS = [
'haystack', # 全文检索注册
]
在总路由中新建haystack的路由。 urlpatterns = [url(r'^search/', include('haystack.urls')),]Haystack配置 # Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://192.168.103.158:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'serach_mall', # Elasticsearch建立的索引库的名称
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 搜索的每页大小
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 3
1.2 Haystack建立数据索引1.创建索引类 from haystack import indexes
from .models import SKU
class SKUIndex(indexes.SearchIndex, indexes.Indexable):
"""SKU索引数据模型类"""
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
"""返回建立索引的模型类"""
return SKU
def index_queryset(self, using=None):
"""返回要建立索引的数据查询集"""
return self.get_model().objects.filter(is_launched=True) 索引类SKUIndex说明: 在SKUIndex建立的字段,都可以借助Haystack由Elasticsearch搜索引擎查询。 其中text字段我们声明为document=True,表名该字段是主要进行关键字查询的字段。 text字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用use_template=True表示后续通过模板来指明。
2.创建text字段索引值模板文件
在项目templates目录中创建text字段使用的模板文件 具体在templates/search/indexes/goods/sku_text.txt文件中定义,其中goods为应用名,sku_text.txt中的sku为模型类小写。
{{ object.id }}
{{ object.name }}
{{ object.caption }}3.手动生成初始索引 $ python manage.py rebuild_index第一次需要生成索引需要执行上述命令,后续会自动生成索引。 1.3 全文检索测试准备测试表单 请求方法:GET 请求地址:/search/ 请求参数:q
<div class="search_wrap fl">
<form method="get" action="/search/" class="search_con">
<input type="text" class="input_text fl" name="q" placeholder="搜索商品">
<input type="submit" class="input_btn fr" name="" value="搜索">
</form>
</div>然后在templates/search/目录下新建search.html接收和渲染全文检索的结果. 1.4 渲染搜索结果Haystack返回的数据包括: <div class="main_wrap clearfix">
<div class=" clearfix">
<ul class="goods_type_list clearfix">
{% for result in page %}
<li>
{# object取得才是sku对象 #}
<a href="/detail/{{ result.object.id }}/"><img src="{{ result.object.default_image.url }}"></a>
<h4><a href="/detail/{{ result.object.id }}/">{{ result.object.name }}</a></h4>
<div class="operate">
<span class="price">¥{{ result.object.price }}</span>
<span>{{ result.object.comments }}评价</span>
</div>
</li>
{% else %}
<p>没有找到您要查询的商品。</p>
{% endfor %}
</ul>
<div class="pagenation">
<div id="pagination" class="page"></div>
</div>
</div>
</div>准备搜索页分页器 <div class="main_wrap clearfix">
<div class=" clearfix">
......
<div class="pagenation">
<div id="pagination" class="page"></div>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
$('#pagination').pagination({
currentPage: {{ page.number }},
totalPage: {{ paginator.num_pages }},
callback:function (current) {
window.location.href = '/search/?q={{ query }}&page=' + current;
}
})
});
</script>这里使用的jquery.pagination.js接收要渲染的数据,当然也可以使用其他框架的分页器或自定义的来接收。
|