一,在ubuntu中用docker下载elasticsearch
-
从仓库拉取镜像
sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
-
解压本地的tar
sudo docker load -i elasticsearch-ik-2.4.6_docker.tar
-
修改配置文件
- elasticsearc-2.4.6/config/elasticsearch.yml第54行。
- network.host:192.123.112.13
- 配置文件可以百度找一个
-
运行elasticsearch
sudo docker run -dti --name=elasticsearch --network=host -v 配置文件地址:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
二、使用haystack和elasticsearch
-
下载
pip install django-haystack
pip install elasticsearch==2.4.6 -
注册apps
INSTALLED_APPS = [
'haystack', # 全文检索
]
- 配置url
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': 'meiduo_mall', # Elasticsearch建立的索引库的名称
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
三、建立数据库索引
- 创建索引类search_indexes.py
from haystack import indexes
from .models import SKU
# 注意这里是indexes.SearchIndex不是indexes.SearchField
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)
- 创建text字段索引值模板文件
在template文件下创建
search/indexes/创建索引的应用名称/ 模型类名称_text.txt
{{ object.id }} 这是字段例子
{{ object.name }}
{{ object.caption }}
- 手动生成索引
python manage.py rebuild_index
三、在模板中定义
- 需要将修改method=“get” action="/search/
- 需要将输入框name修改为q ,name="q"
<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>
点击按钮
出现这个,就对了
到了这将search的html移入templates的search中,进行渲染就好了
四、渲染页面
在haystack.views中已经返回了一些值
query:搜索关键字
paginator:分页paginator对象
page:当前页的page对象(遍历page中的对象,可以得到result对象)
result.objects: 当前遍历出来的模型类对象。
{% for sku in page %}
<div class="col mb-4" style="height: 350px;;">
<div class="card h-100"><a href="javascript:;">
<img src="{{ sku.object.default_image.url }}" style="height: 70%;" class="card-img-top">
<div class="card-body">
<p class="card-text" style="font-size:10px">{{ sku.object.name }}</p>
<span id="pi" style="font-size:10px;color: red;">¥{{ sku.object.price }}</span>
</div>
</a>
</div>
</div>
{% endfor %}