ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二最流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。本篇是在windows平台下的运用

起步

1. 安装jdk

  由于elasticsearch是Java开发的,所以首先要安装Java环境
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载好之后,直接安装, 切记:不要安装在C盘!, 注意环境变量的配置(JAVA_HOME)

2. 安装elasticsearch-rtf

  不建议安装elasticsearch的官网版本,因为集成的插件比较少
下载地址:https://github.com/medcl/elasticsearch-rtf
该版本集成了一些会用到的插件。

解压后,在bin目录下打开命令行工具,输入elasticsearch.bat执行脚本,打开浏览器,在地址栏输入http://127.0.0.1:9200, 如果返回数据则表示运行成功

3.安装elasticsearch-head

  这是(搜索引擎)的可视化管理工具,安装要用到node.js的npm 插件管理器,所以要先安装node.js的npm 插件管理器。

下载地址:https://nodejs.org/en/download/
下载完成后,根据指引安装即可

(1)安装完后后,打开命令行工具

    执行命令 npm

  npm命令是node.js的npm插件管理器,也就是下载插件和安装插件的管理器,国外镜像很慢可能会掉线,我们使用淘宝的npm镜像cnpm

    执行命令:npm install -g cnpm --registry=https://registry.npm.taobao.org

启用淘宝的npm镜像cnpm,注意:启用后当我们要输入npm命令时,就需要输入cnpm

(2)(搜索引擎)的可视化管理工具elasticsearch-head的安装

    下载地址:https://github.com/mobz/elasticsearch-head

    下载后解压到指定目录

(3)cd进入到解压的elasticsearch-head目录,安装elasticsearch-head的依赖包

    执行命令:cnpm install

    
(4)启动elasticsearch-head(搜索引擎)的可视化管理工具,访问http://localhost:9100/,就可以看到(搜索引擎)的可视化管理工具。

    执行命令:cnpm run start

点击连接会发现是灰色的未连接状态,这是因为elsaticsearch的安全策略,在5.0之后的版本不允许第三方插件直接连接,需要修改配置文件,在config文件夹下后缀为yml的文件中添加以下配置:

    http.cors.enabled: truehttp.cors.allow-origin: "*"

重启服务,点击连接,即可成功

应用

  elasticsearch的详细内容还请参阅相关文档,接下来会直接贴上我在使用elasticsearch来实现搜索引擎时的步骤和一些注意事项。搜索引擎是为了数据而存在的,所以你需要准备一个数据源,因此我用scrapy实现了一个简单的爬虫。
  在使用前,为了准备数据要先启动爬虫将数据提交到elasticsearch,如感兴趣具体可前往https://github.com/xinyan818/SimpleSearch-TST

1.声明doc_type

  doc_type在elasticsearch中类似关系型数据库中的数据表,我们需要实现它。

# 数据类型
from elasticsearch_dsl import DocType, Completion, Keyword, Text, Boolean, Integer, Date
# 引入链接函数
from elasticsearch_dsl.connections import connections
# 引入elasticsearch中的分析器
from elasticsearch_dsl.analysis import CustomAnalyzer# 创建Es链接
connections.create_connection(hosts=["127.0.0.1"])# 自定义分词器
class MyAnalyzer(CustomAnalyzer):def get_analysis_definition(self):return {}# 创建分析器对象
# 忽略大小写的筛选器ik_analyzer = MyAnalyzer('ik_max_word', filter=['lowercase'])class NewsType(DocType):# 搜索建议字段# Completion 用来做搜索建议的类型# 不能直接指定分词器名,需要指定一个自定义分词器suggest = Completion(analyzer=ik_analyzer)# 分词title = Text(analyzer="ik_max_word")category = Text()f_url = Text()intro = Text(analyzer="ik_max_word")source = Text()time = Date()# Metaclass Meta:# 索引名称index = 'news'doc_type = 'fashion'if __name__ == '__main__':NewsType.init()

  运行这个python文件即可在服务中声明一个名为news的index,和在其之下名为fashion的type,

2.搜索结果的视图函数

#搜索结果页面
def result(request):if request.method == 'GET':# 取出关键词 搜索类型 页码keyword = request.GET.get('kw', None)s_type = request.GET.get('s_type', 'blog')page_num = request.GET.get('pn', 1)# 没有关键词,定向到首页if not keyword:return redirect('/')# 判断搜索类型# 搜索if s_type == 'news':# 1. 搜索的索引index = 'news'doc_type = 'fashion'fields = ['title', 'intro']start = datetime.now()rs = es.search(index=index,doc_type=doc_type,body={'query': {'multi_match': {'query': keyword,'fields': fields}},'from': (int(page_num)-1)*10,'size': 10,'highlight': {'pre_tags': ['<span class="KeyWord">'],'post_tags': ['</span>'],'fields': {'title': {},'intro': {}}}})# 搜索花费时间# total_seconds() 统计秒数use_time = (datetime.now() - start).total_seconds()hits_list = []for hit in rs['hits']['hits']:try:h_dic = {}# 判断highlight中有没有titleif 'title' in hit['highlight'].keys():h_dic['title'] = hit['highlight']['title'][0]else:h_dic['title'] = hit['_source']['title']# 再判断introif 'intro' in hit['highlight'].keys():intro_list = hit['highlight']['intro']intro_list.reverse()h_dic['content'] = ''.join(intro_list)else:h_dic['content'] = hit['_source']['intro']# 详情地址h_dic['detail_url'] = hit['_source']['f_url']except:continuehits_list.append(h_dic)navs = NAVS# 计算页码total = rs['hits']['total']page_nums = int(math.ceil(total/10))page_num = int(page_num)if page_num < 6:if page_nums <= 10:pages = range(1, page_nums+1)else:pages = range(1, 11)elif (page_num >= 6) and (page_num <= page_nums - 5):pages = range(page_num - 5, page_num + 5)else:if page_nums <= 10:pages = range(1, page_nums+1)else:pages = range(page_nums-9, page_nums + 1)data = {'navs': navs,'search_type': s_type,'hits_list': hits_list,'kw': keyword,'pages': pages,'page_nums': page_nums,'pn': page_num,'total': total,'use_time': use_time}return render(request, 'result.html', data)

利用elasticsearch实现搜索引擎相关推荐

  1. Python分布式爬虫-elasticsearch搭建搜索引擎

    Python分布式爬虫-elasticsearch搭建搜索引擎 一.elasticsearch使用 1.elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它 ...

  2. 【Elasticsearch】搜索引擎从0到1 有赞 视频笔记

    1.概述 转载:https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247486562&idx=1&sn=2c895d ...

  3. 一文看懂-ElasticSearch全文搜索引擎

    一文看懂-ElasticSearch全文搜索引擎 一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以 ...

  4. ElasticSearch分布式搜索引擎从入门到实战应用(入门篇-基本命令操作)

    ElasticSearch分布式搜索引擎从入门到实战应用(入门篇) 1.入门须知 2.ElasticSearch概述 2.1.ES简介 2.2.应用场景 3.ES和Solr的对比 3.1.ES作用 3 ...

  5. ElasticSearch分布式搜索引擎——从入门到精通

    ES分布式搜索引擎 注意: 在没有创建库的时候搜索,ES会创建一个库并自动创建该字段并且设置为String类型也就是text 什么是elasticsearch? 一个开源的分布式搜索引擎,可以用来实现 ...

  6. elasticsearch分布式搜索引擎详细使用总结

    文章目录 一.初识elasticsearch 1.1.ES了解 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4 ...

  7. Elasticsearch——分布式搜索引擎01(索引库、文档、RestAPI、RestClient、拼音分词器、IK分词器)

    Elasticsearch--分布式搜索引擎01(索引库.文档.RestAPI.RestClient.拼音分词器.IK分词器) 一.初识 elesticsearch 1.1 简介 1.2 倒排索引(重 ...

  8. ElasticSearch作为搜索引擎-Spring Boot集成

    ElasticSearch作为搜索引擎,我们需要解决2大问题: 1,  如何将被搜索的数据在ES上创建反向索引 2,  Java代码如何与ES交互 其中第一个大问题又分为两个小问题 1.1,如何初始化 ...

  9. 如何用计算机做微积分,利用计算知识搜索引擎WolframAlpha做微积分(快速指南).doc...

    利用计算知识搜索引擎WolframAlpha做微积分 快速指南 说明:点击各个公式进入WolframAlpha网页,然后将其中的函数换成需要计算函数即可.求极限?lim sin2x/(e^x-1), ...

  10. Elasticsearch全文搜索引擎-PHP使用教程。

    1.声明依赖关系:         比方说,你的项目中需要一个php版的elasticsearch框架.为了将它添加到你的项目中(下载),你所需要做的就是创建一个 composer.json 文件,其 ...

最新文章

  1. Dubbo+zookeeper使用方法以及注意事项
  2. HttpClient post 与get
  3. PHP5+apache_2.0.50+MySQL4.0+SQLServer安装方法
  4. C4D中重点、难点分析
  5. TaintDroid深入剖析之启动篇
  6. Panabit安装测试小结
  7. 初学微信小程序 TodoList
  8. wordpress 新建php文件大小,WordPress最大上传文件大小限制修改
  9. hive mysql hdfs关系_Hive中的数据库、表、数据与HDFS的对应关系
  10. RxJava学习-使用篇
  11. 如何利用redis实现秒杀系统
  12. 卸载nginx php mysql_ubuntu16.04彻底删除nginx+php
  13. Android studio 如何导入并引用Library工程
  14. Linux设备驱动模型三 kset
  15. python滤波器信号处理_详解利用Python scipy.signal.filtfilt() 实现信号滤波
  16. cs231n assignment3
  17. Gh0st3.6编译和源码免杀问题
  18. oppok3如何刷机_OPPO K3怎么刷机?
  19. 抖音巨量百应怎么发福袋?四川鹰迪
  20. sql 去重 distinct

热门文章

  1. 【Mockplus教程】安装Mockplus
  2. Laravel压缩图片
  3. uni-app 图片上传组件 canvas压缩
  4. uniapp 小程序端上传并压缩图片
  5. 用R包TCGA-Assembler下载TCGA数据
  6. [问题] trying to connect to remote host
  7. 【免费好用】节假日查询接口
  8. 计算机设置开机密码时间屏保,电脑屏幕保护密码设置方法
  9. 如何使用数据分析客户购买意愿
  10. 对比度调整的各种方法(一)