Elasticsearch
Elasticsearch(简称ES)是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。
基本组件
索引(index)
:文档容器,换句话说,索引是具有类似属性的文档的集合。类似新华字典的索引检索页,里面包含了关键词与词条的对应关系,并记录词条的位置。索引名必须使用小写字母; 搜索引擎进行全文检索时,将关键字在索引数据中进行快速对比查找,进而找到数据的真实存储位置。
类型(type)
:类型是索引内部的逻辑分区,其意义完全取决于用户需求。一个索引内部可定义 一个或多个类型。一般来说,类型就是拥有相同的域的文档的预定义。
文档(document)
:文档是Lucene索引和搜索的原子单位,它包含了一个或多个域。是域的容器;基于JSON格式表示。(每个域的组成部分:一个名字,一个或多个值;拥有多个值的域,通常称为多值域;)
映射(mapping)
:原始内容存储为文档之前需要事先进行分析,例如切词(将一句话拆解成多个单字或词)、过滤掉某些词等; 映射用于定义此分析机制该如何实现;除此之外,ES还为映射提供了诸如将域中的内容排序等功能。
ES的集群组件
Cluster
:ES的集群标识为集群名称;默认为”elasticsearch”。节点就是靠此名字来决定加入到哪个集群中。一个节点只能属性于一个集群。
Node
:运行了单个ES实例的主机即为节点。用于存储数据、参与集群索引及搜索操作。节点的标识靠节点名。
Shard
:将索引切割成为的物理存储组件;但每一个shard都是一个独立且完整的索引;创建 索引时,ES默认将其分割为5个shard,用户也可以按需自定义,创建完成之后不可修改。shard有两种类型:primary shard和replica。Replica用于数据冗余及查询时的负载均衡。每个主shard的副本数量可自定义,且可动态修改。
使用Docker安装Elasticsearch
- 拉取镜像
docker image pull delron/elasticsearch-ik:2.4.6-1.0
- 运行容器
docker run -d –name=elasticsearch –network=host -v /root/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
- 编辑配置文件
- 给映射目录添加权限
- 重启容器
docker container restart elasticsearch
使用haystack对接ES
Django中可以通过使用 Haystack 来调用 Elasticsearch 搜索引擎。Haystack 可以在不修改代码的情况下使用不同的搜索后端(比如 Elasticsearch、Whoosh、Solr等等)。
- Haystack安装
pip install django-haystack pip install elasticsearch==2.4.1
- Haystack注册应用和路由
INSTALLED_APPS = [ 'haystack', # 全文检索 ] # 总路由 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建立的索引库的名称 }, } # 当添加、修改、删除数据时,自动生成索引,保证了在Django运行起来后, 有新的数据产生时,Haystack仍然可以让Elasticsearch实时生成新数据的索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # haystack分页 HAYSTACK_SEARCH_RESULTS_PER_PAGE = 6
- haystack建立数据索引
通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。本项目中对SKU信息进行全文检索,所以在goods子应用中新建search_indexes.py文件,用于存放索引类。
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说明:
- 创建text字段索引值模板文件
在templates目录中创建text字段使用的模板文件,在templates/search/indexes/goods(子应用名称小写)/sku(被索引模型类名称小写)
_text.txt文件中定义
{
{
object.id }} {
{
object.name }} {
{
object.caption }}
- 手动生成初始索引
python manage.py rebuild_index
- 前端渲染搜索结果
{% 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 %}
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233250.html原文链接:https://javaforall.net