Es(Elasticsearch)搜索环境配置
# 0. 依赖java,需要提前配置java环境
# 1. 解压 elasticsearch-2.3.3.zip
链接:https://pan.baidu.com/s/1s6ObfU9enl_xPazw8NxgdA
提取码:Aa12
# 2. 解压插件: elasticsearch-analysis-ik-1.9.3.zip,
插件内容复制到es目录下plugins(新建)目录下的ik目录中
# 3. es中bin目录双击elasticsearch.bat,运行环境
# 4. 出现:started,代表启动成功,浏览器访问黑窗口中的ip:端口
# 5. postman验证:访问路径: http://127.0.0.1:9200/_analyze?analyzer=ik
post请求:body--raw--text(你猜猜我是谁 )
Haystack配置及建立索引
# 1. 安装库文件 (django-haystack)
# 2. 安装库文件(elasticsearch)2.3.0
# 3. Haystack 注册应用和路由(主应用-settings.py)
INSTALLED_APPS = [
'haystack' #全文搜索
]
# 4. 配置路由(主应用的urls.py)
re_path(r'^search/', include('haystack.urls')),
# 5. 在配置文件中配置Haystack为搜索引擎后端
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'mm', # Elasticsearch建立的索引库的名称
},
}
# HAYSTACK_SIGNAL_PROCESSOR 配置项保证了在Django运行起来后,有新的数据产生时(增删改),
# Haystack仍然可以让Elasticsearch实时生成新数据的索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
建立索引
# 1. 那个子应用使用就在那个子应用中新建search_indexes.py文件,用于存放索引类
# 商品搜索索引模型类
from haystack import indexes
from shouye.models import ProductSku
class ProductSkuIndex(indexes.SearchIndex, indexes.Indexable):
# 索引字段
# document=True 该索引字段是进行关键字查询的字段
# use_template=True 表示多个查询字段在txt模板中指定
text = indexes.CharField(document=True, use_template=True)
# 返回要查询、建立索引的模型类
def get_model(self):
return ProductSku # 添加索引的数据库表
# 返回查询的结果集
def index_queryset(self, using=None):
return self.get_model().objects.filter(is_shop=True)
# 2. 在templates/search/indexes/shouye/productsku_text.txt目录中创建text字段索引值模板文件
# (ProductSku模型类所在的应用名称 模型类名小写_text.txt)
{{ object.id }} # {{ object.字段名 }}
{{ object.name }}
{{ object.fubiaoti }}
# 3. 手动生成初始索引
python manage.py rebuild_index
# 4. html页面绑定搜索路由 : action="/search/"
<form method="get" action="/search/">
# 5. 在templates中的search文件夹中创建 search.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>喵喵商城-商品搜索</title>
<link rel="stylesheet" type="text/css" href="{{ static('css/jquery.pagination.css') }}">
<link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}">
<link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}">
<script type="text/javascript" src="{{ static('js/jquery-1.12.4.min.js') }}"></script>
<script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
<script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
<script type="text/javascript" src="{{ static('js/utils.js') }}"></script>
<script type="text/javascript" src="{{ static('js/jquery.pagination.min.js') }}"></script>
</head>
<body>
<div id="app">
<div class="header_con">
<div class="header" v-cloak>
<div class="welcome fl">欢迎来到喵喵商城</div>
<div class="fr">
<div class="login_btn fl" v-show="flag1">
欢迎您:<em>{[ username ]}</em>
<span>|</span>
<a href="{{ url('users:logout') }}">退出</a>
</div>
<div class="login_btn fl" v-show="flag2">
<a href="{{ url('users:login') }}">登录</a>
<span>|</span>
<a href="{{ url('users:zhuce') }}">注册</a>
</div>
<div class="user_link fl">
<span>|</span>
<a href="{{ url('users:userinfo') }}">用户中心</a>
<span>|</span>
<a href="">我的购物车</a>
<span>|</span>
<a href="">我的订单</a>
</div>
</div>
</div>
</div>
<div class="search_bar clearfix">
<a href="{{ url('shouye:index') }}" class="logo fl"><img src="{{ static('images/logo.png') }}"></a>
<div class="search_wrap fl">
<form method="get" action="/search/" class="search_con">
<input type="text" class="input_text fl" name="q" placeholder="搜索商品" value="{{ query }}">
<input type="submit" class="input_btn fr" name="" value="搜索">
</form>
<ul class="search_suggest fl">
<li><a href="#">满199减100</a></li>
<li><a href="#">家装建材</a></li>
<li><a href="#">潮流家电</a></li>
<li><a href="#">华为新品</a></li>
</ul>
</div>
<div class="guest_cart fr">
<a href="" class="cart_name fl">我的购物车</a>
<div class="goods_count fl" id="show_count"></div>
<ul class="cart_goods_show">
<li>
<img src="" alt="商品图片">
<h4></h4>
<div></div>
</li>
</ul>
</div>
</div>
<div class="main_wrap clearfix">
<div class=" clearfix">
<ul class="goods_type_list clearfix">
{% for p in page %}
<li>
<a href=""><img src="http://yhcsxtest.yonghui.cn//wimages/240527/240527_middle.jpg?time=200820154221"></a>
<h4><a href="">{{ p.object.name }}</a></h4>
<div class="operate">
<span class="price">¥ {{ p.object.price }}</span>
<a href="#" class="add_goods" title="加入购物车"></a>
</div>
</li>
{% endfor %}
</ul>
<div class="pagenation">
<div id="pagination" class="page"></div>
</div>
</div>
</div>
<div class="footer">
<div class="foot_link">
<a href="#">关于我们</a>
<span>|</span>
<a href="#">联系我们</a>
<span>|</span>
<a href="#">招聘人才</a>
<span>|</span>
<a href="#">友情链接</a>
</div>
<p>CopyRight © 2018 北京*******有限公司 All Rights Reserved</p>
<p>电话:010-******* 京ICP备********号</p>
</div>
</div>
</body>
<script type="text/javascript" src="{{ static('js/search.js') }}"></script>
<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>
</html>
商品搜索展示
# haystack返回的数据:
query搜索的关键字
paginator分页对象
page当前页的数据对象 for p in page
p.object.name
# setting,py配置每页展示多少条数据
HAYSTACK_SEARCH_RESULTS_PER_PAGE=6
标签:search,16,--,object,shouye,indexes,索引,搜索,haystack
From: https://www.cnblogs.com/kh-1314/p/17123601.html