Docker中安装Elasticsearch及如何设置通过关键字的查找

需求分析:

当用户在一些网上购物时,需要时通过搜索框来查找需要的商品,而要搜索的商品就是用户查找的关键字,用户通过关键字的查找,我们要为用户提供相关的搜索结果。

这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而且查询需要在多个字段中进行,使用like关键字也不方便。

我们引入搜索引擎来实现全文检索。全文检索即在指定的任意字段中进行检索查询。

搜索引擎原理

通过搜索引擎进行数据查询时,搜索引擎并不是直接在数据库中进行查询,而是搜索引擎会对数据库中的数据进行一遍预处理,单独建立起一份索引结构数据。

我们可以将索引结构数据想象成是字典书籍的索引检索页,里面包含了关键词与词条的对应关系,并记录词条的位置。

我们在通过搜索引擎搜索时,搜索引擎将关键字在索引数据中进行快速对比查找,进而找到数据的真实存储位置。

Elasticsearch

开源的 Elasticsearch 是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

搜索引擎在对数据构建索引时,需要进行分词处理。分词是指将一句话拆解成多个单字或词,这些字或词便是这句话的关键词;

Elasticsearch 不支持对中文进行分词建立索引,需要配合扩展elasticsearch-analysis-ik来实现中文分词处理。

使用Docker安装Elasticsearch及其扩展

由于Elasticsearch 是用 java来写的,所以我们需要在我们的环境中有对应的java,然后把java环境搭建好之后, 把elasticsearch组件安装进去,在将对中文扩展的支持在安装进去name一整套的方案才能实现; 但是如果我们换台电脑的话又得重新安装这些环境,, 使用Docker 的话可以将其做成一个镜像, 将其分发出去就是现成的饭, 直接吃就ok了;简化了我们安装的过程;

获取镜像,可以通过网络pull

docker image pull delron/elasticsearch-ik:2.4.6-1.0

或者用自己拉取好的镜像文件:

docker load -i elasticsearch-ik-2.4.6_docker.tar

修改elasticsearch的配置文件 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址为本机ip地址

network.host: 127.0.0.1

创建docker容器运行

docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config Desktop/elasticsearch-ik:2.4.6-1.0

 使用haystack对接Elasticsearch

我们在django中可以通过使用haystack来调用Elasticsearch搜索引擎。

安装

pip install drf-haystack
pip install elasticsearch==2.4.1   # 指定版本

drf-haystack是为了在REST framework中使用haystack而进行的封装(如果在Django中使用haystack,则安装django-haystack即可)。

注册应用

INSTALLED_APPS = [
    ...
    'haystack',
    ...
]

配置

在配置文件中配置haystack使用的搜索引擎后端

# Haystack
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',  # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
        'INDEX_NAME': 'xxshopping',  # 指定elasticsearch建立的索引库的名称
    },
}

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

注意:

HAYSTACK_SIGNAL_PROCESSOR 的配置保证了在Django运行起来后,有新的数据产生时,haystack仍然可以让Elasticsearch实时生成新数据的索引;

创建索引类:

        商品SKU: 一个商品的详细信息;

通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。

在应用中新建 search_indexes.py 文件,这个文件名字是会被 hastack多去索引的, 里面用于存放索引类;

get_model 这个方法是说明我们最终建立索引的所有字段都是跟这个模型类视有关系的,在这个方法里真正的指明;

创建序列化器:

最后创建建立索引的数据:

python manage.py rebuild_index    选 y 

此时, 在我们的数据库中就有了我们索引的数据;

接下来,我们的索引数据有了, 那我们需提供给前端一个视图,这个视图接收到前端的关键词通过ES进行查询,:

创建索引的序列器:

在我们应用的路由中进行注册:

 

 最后就是设置我们前端的search.html 的页面,及对应的js加载文件;

猜你喜欢

转载自blog.csdn.net/bin_1022/article/details/81274577