首页 > 其他分享 >16- 项目梳理-搜索--shouye

16- 项目梳理-搜索--shouye

时间:2023-02-15 18:37:19浏览次数:38  
标签:search 16 -- object shouye indexes 索引 搜索 haystack

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

相关文章