Elasticsearch搜索引擎开发实战(txt+pdf+epub+mobi电子书下载)


发布时间:2021-02-14 14:59:38

点击下载

作者:罗刚,张子宪

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Elasticsearch搜索引擎开发实战

Elasticsearch搜索引擎开发实战试读:

前言

搜索引擎在人们的日常生活中发挥着越来越重要的作用。随着开源软件的普及与发展,涌现出了许多优秀的搜索软件,如Elasticsearch、Solr等。其中,Elasticsearch以大规模分布式搜索见长,而Solr则以分面搜索见长。

本书选择Elasticsearch作为实现搜索引擎的工具。Elasticsearch具有强大的分布式搜索和可视化功能,不仅丰富了实现搜索引擎的方法,而且还使复杂抽象的数据结构与算法变得直观而鲜活,因此在国外被迅速地引入到人工智能的相关课程中。

本书全面、系统地介绍了分布式搜索引擎的相关内容及Elasticsearch中的Java代码实现。本书内容既注重基础知识,又非常注重实践,每章都提供了大量的实例程序。读者可以通过这些实例快速上手,并迅速提高搜索引擎开发技术。通过对本书内容的学习,读者不仅可以掌握搜索引擎开发的基本知识,而且还可以灵活地将Elasticsearch运用到解决实际问题当中,从而提升工作效率。本书特色

1.内容全面,结构合理

本书首先介绍了Elasticsearch的安装和基本使用方法,然后介绍了从搜索到内容监控等方方面面的知识。在内容安排上,本书根据读者的认知规律对学习梯度做了合理安排,降低了学习难度。

2.讲解详尽,实例丰富

本书对每个技术要点都做了细致入微的介绍,并且在讲解的过程中提供了丰富的实例,而且每个实例都经过精挑细选,具有很强的针对性,特别是本书最后的应用案例,更是对相关技术的一个全面应用。另外,书中所有实例的实现代码都考虑了通用性,读者可以直接将代码移植过来加以修改,即可解决自己的实际问题。

3.语言通俗,图文并茂

本书用通俗易懂的语言进行讲解,尽量避免生疏的专业术语。在讲解一些重要知识点时,书中给出了大量的图示及实例运行结果,帮助读者更加直观、高效地理解所学内容。

4.提供配套教学PPT,使学习更高效

为了便于读者高效、直观地学习本书内容,作者特意针对每章的重点内容制作了教学PPT,这些PPT和本书的实例源文件都会免费提供给读者下载。本书内容

本书共分8章,具体内容介绍如下:

第1章Elasticsearch开发搜索引擎应用,主要介绍了搜索引擎开发方面的一些基础知识和Elasticsearch开发环境的安装,并对Java API与Elasticsearch搜索集群的交互也做了介绍。

第2章开发中文搜索引擎,主要介绍了中文搜索引擎开发的相关内容,包括中文分词原理和中文分词插件开发等。

第3章Mapping详解,主要介绍了Mapping概念及如何使用Mapping,包括Mapping索引、Mapping数据类型、Mapping参数和动态Mapping等。

第4章深入源码分析,详细分析了Elasticsearch源代码,主要内容包括Lucene源码分析、启动搜索服务、Guice框架、日期和时间库、Transport模块、线程池、模块、Netty通信框架、缓存、分布式、Zen发现机制、联合搜索和JVM字节码等。

第5章提高搜索相关性,主要介绍了向量空间检索模型、BM25检索模型、学习评分、查询意图识别和图像特征提升检索体验等内容。

第6章搜索界面开发,涵盖的主要内容包括使用Searchkit实现搜索界面;Spring Boot入门;Java模板引擎Pebble介绍;通过Spring-data-elasticsearch项目访问Elasticsearch;REST基本概念;使用Vue.js开发搜索界面;使用Vue.js Paginator插件实现翻页;实现搜索接口;Suggester搜索词提示;Word2vec挖掘相关搜索词;部署网站;使用Rust开发搜索界面等。

第7章Elastic栈系统监控,主要介绍了使用Elasticsearch和相关软件实现系统监控,包括管理Elasticsearch集群、Logstash数据处理工具、Filebeats文件收集器、消息过期、Kibana可视化平台、Flume日志收集系统、Kafka分布式流平台和Graylog日志管理平台等内容。

第8章案例分析,主要介绍了双语句对搜索、内容管理系统站内检索,以及使用Elasticsearch搜索公开的药物临床试验项目信息等几个案例。本书读者对象

·信息检索技术爱好者;

·搜索引擎开发人员;

·搜索引擎优化(SEO)人员;

·从事算法研究的技术人员;

·高等院校理工科专业的学生和老师。本书配套资源及获取方式

为了方便读者高效学习,本书特意提供了以下配套资源:

·本书配套教学PPT;

·本书源代码文件;

·本书涉及的一些开发工具的安装包。

这些配套资源需要读者自行下载,请登录机械工业出版社华章公司的网站www.hzbook.com,搜索到本书,然后在页面上的“资料下载”模块下载即可。本书作者

本书由罗刚主笔编写,其他参与编写的人员有张子宪、沙芸、柳若边、崔智杰、石天盈、张继红、罗庭亮。

在此感谢我的家人、同事及所有在本书写作过程中提供过帮助的人!另外,本书在编写过程中参考了一些开源代码,在此对相关作者也一并表示感谢!

虽然我们对书中所述内容都尽量核实,并进行了多次校对,但由于写作时间仓促,加之作者水平所限,书中可能还存在疏漏和错误之处,恳请广大读者批评、指正。联系我们,请发电子邮件到hzbook2017@163.com。罗刚于北京第1章Elasticsearch开发搜索引擎应用信息时代,可供获取的数据大量涌现。那么如何通过搜索引擎从这些数据中挖掘出有价值的数据呢?正是基于这个需求,开源大数据搜索引擎Elasticsearch应运而生。1.1搜索引擎开发需求

网站搜索的一般需求有如下几点。

·支持微服务:微服务架构模式可以用来构建复杂应用。

·弹性负载:通过将搜索访问请求自动分发到多个服务节点上来扩展搜索系统对外的服务能力,实现应用程序容错。

·容易部署:即集成的功能,不依赖第三方的分布式应用程序协调服务。

·安全控制:控制非法的外部访问。

·管理界面:管理搜索集群的健康状况,方便查看数据分布情况等。1.2准备开发环境

Elasticsearch采用Java语言开发,所以我们需要先准备基本的Java开发工具JDK,然后再准备运行在JDK上的Eclipse。1.2.1 Windows命令行cmd

假设有一个标准件工厂,在车间生产产品,在工地使用这些产品。与之类似,一般是在集成开发环境中开发软件,如果在Windows操作系统中运行开发的软件,则往往通过Windows命令行来运行。

在图形化用户界面出现之前,人们就是用命令行来操作计算机的。Windows命令行是通过Windows系统目录下的cmd.exe程序执行的。执行这个程序最直接的方式是找到该程序,然后双击,但cmd.exe程序并没有桌面快捷启动图标,所以启动时比较麻烦。

鉴于此,可以在“开始”菜单的运行窗口中直接输入程序名,回车后运行这个程序。具体操作方法:单击“开始”|“运行”命令,打开资源管理器中的运行程序窗口;或者直接使用快捷键——窗口键+R键,打开运行程序窗口。然后输入程序名cmd后单击“确定”按钮,弹出命令提示窗口。因为可以通过这个黑屏的窗口直接输入相应命令来控制计算机,所以也称其为控制台窗口。

说明:Console,即控制台。遥控器上有控制面板,更复杂的设备往往有控制台。例如,一台机床或者数控设备的控制箱,通常会被称为控制台。顾名思义,控制台就是一个直接控制设备的台面,往往是一个上面有很多控制按钮的面板。在计算机里,把直接连接在计算机上的键盘和显示器叫做控制台。

通常用扩展名来表示文件的类别,如exe表示可执行文件。文件名称由文件名和扩展名组成,文件名和扩展名之间由小数点分隔,如java.exe。

当我们建立或修改一个文件时,必须向Windows指明该文件的位置。文件的位置由三部分组成:驱动器、文件所在路径和文件名。路径是由一系列路径名组成的,这些路径名之间用“\”分开,如C:\Program Files\Java\jdk1.8.0_03\bin\java.exe。

开始的路径一般是C:\Users\Administrator,就像公园的地图上往往会标出游客的当前位置。Windows命令行也有当前路径的概念,如C:\Users\Administrator就是当前路径。

可以用cd命令改变当前路径,例如,改变到C:\Program Files\Java\jdk1.8.0_03路径,可以用如下命令:C:\Users\Administrator>cd C:\Program Files\Java\jdk1.8.0_03

如果输入“cd d:”命令,这样的效果是改变当前路径到“d:”目录下。所以切换盘符不能使用cd命令,而是直接输入盘符的名称。例如想要切换到D盘,可以使用如下命令:C:\Users\Administrator>d:

系统约定从指定的路径找可执行文件,这个路径通过PATH环境变量指定。环境变量是一个“变量名=变量值”的对应关系,每一个变量都有一个或者多个值与之对应。如果是多个值,则这些值之间用分号隔开。例如,PATH环境变量可能对应这样的值:“C:\Windows\system32;C:\Windows”,表示Windows会从C:\Windows\system32和C:\Windows两个路径下寻找可执行文件。

设置或者修改环境变量的具体操作步骤是:首先在Windows桌面右击“我的电脑”,在弹出的快捷菜单中选择“属性”命令,在弹出的对话框中选择“高级”选项,然后在弹出的对话框中单击“环境变量”按钮,在弹出的对话框中设置用户变量或者系统变量,最后再设置环境变量PATH的值。

如果是用Windows 7以上的操作系统,可能找不到“我的电脑”快捷图标,其实打开桌面上“我的电脑”,就是运行资源管理器。打开资源管理器的另外一种方法是:按住键盘上的窗口键不放,然后再按E键之后选择“属性”标签,后面的操作相同,不再赘述。

环境变量设置完成后,需要重新启动命令行才能设置生效。为了检查环境变量是否已设置正确,可以在命令行中显示指定环境变量的值,需要用到echo命令。echo命令用来显示一段文字。例如:C:\Users\Administrator>echo Hello

执行上面的命令后,将在命令行输出:Hello

如果要引用环境变量的值,可以用前后两个百分号把变量名包围起来,如“%变量名%”。例如,使用echo命令显示环境变量PATH中的值:C:\Users\Administrator>echo %PATH%1.2.2 在Windows下使用Java

本节首先介绍如何安装JDK,然后介绍如何在命令行开发Java程序。Java开发环境简称JDK(Java Development Kit),JDK包括Java运行环境(Java Runtime Envirnment)、一堆Java工具和Java基础类库。可以从Java官方网站http://www.oracle.com/technetwork/java/index.html下载得到JDK,注意不是http://www.java.com下的Java虚拟机。

进入官网后,选择下载Java SE,也就是Java的标准版本,然后选择Latest Release也就是最新发布的安装程序,完整的JDK版本号中包括大版本号和小版本号。例如1.7.0中的大版本号是7,小版本号是0,而1.8.22的大版本号是8,小版本号是22。因为可以在Windows或Linux等多种操作系统环境下开发Java程序,所以有多个操作系统的JDK版本可供选择。

因为JDK是有版权的,所以需要接受许可协议(Accept License Agreement)后才能下载。如果是在Windows环境下开发,就选择Windows x86,这样会下载类似jdk-8u121-windows-i586.exe这样的文件,下载完毕后,使用默认方式安装JDK即可。

JDK相关的文件都放在一个叫做JAVA_HOME的根目录下。JDK根目录的命名格式是:C:\Program Files\Java\jdk1.8.0_最后以一个数字类型的版本号结尾,如10或者21等。

因为一台计算机上可以安装多个JDK和JVM,为了避免混乱,可以新增环境变量JAVA_HOME,指定一个默认使用的JDK。

使用echo命令检查环境变量JAVA_HOME:>echo %JAVA_HOME%C:\Program Files\Java\jdk1.8.0_10

Eclipse集成开发环境只需要JAVA_HOME这一个环境变量即可。如果要检查JAVA_HOME是否已经正确设置,使用如下命令后显示虚拟机的版本号就表示设置正确了。>"%JAVA_HOME%"\bin\java -versionjava version "1.8.0_10-rc"Java(TM) SE Runtime Environment (build 1.8.0_10-rc-b28)Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)

如果还需要在Windows控制台下执行Java程序,则需要访问编译源代码的javac.exe或者执行class文件字节码的java.exe。环境变量PATH指定了从哪里找java.exe这样的可执行文件,可以通过多个路径查找可执行文件,这些路径以分号隔开。如果想在命令行运行Java程序,还可以修改已有的环境变量PATH,增加Java程序所在的路径。例如,C:\Program Files\Java\jdk1.8.0_10\bin。

然后检查环境变量PATH:>echo %PATH%

如果要检查PATH是否已经正确设置,只要在任何路径下输入javac命令都能显示javac的用法,就表示设置正确了,也可以用第一个Java程序试验一下。

新建一个Java项目后,在这个项目的src路径下新建一个叫做Search的Java类:public class Search { public static void main (String args[]) { System.out.println("Hello Search!"); }}

运行结果如下:>javac Search.java>java Search

看运行结果是否显示Hello Search!

最简单的方法是可以使用javac构建出class文件,对于复杂的项目,一般是使用工具构建项目源代码。Gradle就是一个可用于构建Java项目的工具,Elasticsearch本身也是使用Gradle构建。可以下载二进制文件来安装Gradle,网址如下:

https://services.gradle.org/distributions/gradle-3.5-bin.zip。

在Windows上自动设置Gradle环境变量的脚本如下:set input=F:\soft\gradle-3.5echo gradle 路径为%input%set gradlePath=%input%::创建GRADLE _HOMEwmic ENVIRONMENT createname="GRADLE_HOME",username="",VariableValue="%javaPath%"call set xx=%Path%;%gradlePath%\bin::echo %xx%::将环境变量中的字符重新赋值到path 中wmic ENVIRONMENT where "name='Path' and username=''" setVariableValue="%xx%"pause

打开控制台并运行gradle-v命令以显示版本来验证安装是否成功,例如:C:\Users\Administrator>gradle -v

显示如下输出:------------------------------------------------------------Gradle 3.5------------------------------------------------------------Build time: 2017-04-10 13:37:25 UTCRevision: b762622a185d59ce0cfc9cbc6ab5dd22469e18a6Groovy: 2.4.10Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015JVM: 1.8.0_121 (Oracle Corporation 25.121-b13)OS: Windows Server 2008 6.0 x86

可以在Gradle构建中使用标准和定制的Ant任务,就像在Ant自身中使用一样。另外,可以导入现有的Ant脚本,就像下面这样简单:ant.importBuild 'build.xml'1.2.3 Linux终端

虽然使用Linux操作系统办公的人不多,但是很多大数据应用都运行在Linux操作系统下。

首先在Windows下安装Chrome浏览器,然后可以通过网址http://sshy.us/登录Linux服务器。如果是用root账户登录,则终端提示符是“#”,否则终端提示符是“$”。

如果有现成的Linux服务器可用,可以使用支持SSH协议的终端仿真程序SecureCRT连接到远程Linux服务器上,因为可以保存登录密码,所以比较方便。除了SecureCRT,还可以使用开源软件PuTTY(http://www.chiark.greenend.org.uk/~sgtatham/putty),以及可以保存登录密码的PuTTY Connection Manager。

使用VMware、Linux可以运行在Windows系统下,VMware可以让Linux运行在虚拟机中,而且不会破坏原来的Windows操作系统。

首先要准备好VMware,当然仍然需要Linux光盘文件。就好像华山派有剑宗和气宗,Linux也有很多种版本,例如RedHat、Ubuntu及SUSE,这里选择CentOS(http://www.centos.org/)。

也可以在Windows下安装Cygwin,使用它来练习Linux的常用命令。

如果需要安装软件,可以下载RPM安装包,然后使用RPM安装。但操作系统对应的RPM安装包找起来比较麻烦,一个软件包可能依赖其他的软件包,为了安装一个软件可能需要下载多个它所依赖的软件包。

为了简化安装操作,可以使用Yum(Yellow dog Updater,Modified)来安装,也称其为黄狗升级管理器。Yum会自动计算出程序之间的相互关联性,并且计算出完成软件包的安装需要哪些步骤,这样在安装软件时,不会再被那些关联性问题所困扰。

Yum会自动从网络上下载并安装软件,有点类似于360软件管家,但是不会有商业倾向的推销软件。例如,安装支持wget和rzsz命令的软件有:#yum install wget#yum install lrzsz

可以使用Nodepad++自带的插件NppFTP编辑Linux下的文件。有些生产环境的集群通过跳板机才能接触到。为了方便在服务器端管理和开发Elasticsearch相关应用,可以采用Micro(https://github.com/zyedidia/micro)这样的终端文本编辑器。

可以使用DNF安装Micro,在安装DNF前,必须先安装并启用epel-release依赖。使用Yum安装epel-release的命令如下:# yum install epel-release

如果没有DNF安装工具软件,也可以直接安装Micro的预编译版本。使用wget下载Micro:#wget https://github.com/zyedidia/micro/releases/download/nightly/micro-1.3.4-67-linux64.tar.gz#tar -xf ./micro-1.3.4-67-linux64.tar.gz

编辑/etc/profile配置文件,增加Micro所在的路径到PATH环境变量/home/soft/micro-1.3.4-67。# ./micro /etc/profile

说明:和Windows不同,Linux操作系统下的路径名之间用“/”分开。./micro-1.3.4-67-linux64.tar.gz表示当前路径下的micro-1.3.4-67-linux64.tar.gz文件。

增加如下命令:export PATH=/home/soft/micro-1.3.4-67:$PATH

可以使用Micro来编辑配置文件:#micro /etc/security/limits.conf

保存文件后,按Ctrl+Q组合键退出。很多Linux环境都带有Python,如果版本太旧,读者可以自行安装。# yum install python34

下面先看下当前版本安装在了哪个目录下:# which python

输出结果如下:/usr/bin/python

一般使用Bash将用户可读的命令转换成计算机可理解的命令,并控制命令执行。

Bash脚本中使用的特殊字符有:#:Comments~:home directory

在屏幕上打印“Hello”:echo "Hello"

将ABC分配给a:a=ABC

输出a的值:echo $a

在屏幕上打印ABC。

将ABC.log分配给b:b=$a.log

输出b的值:# echo $b

在屏幕上输出:ABC.log

把文件ABC.log中的内容写入testfile:# cat $b > testfile

这里把cat命令的输出重定向到testfile。

我们可以把重复执行的Shell脚本写入一个文本文件中。和Windows不同,Linux不以文件后缀名作为系统识别文件类型的依据,但是可以作为我们识别文件的依据,因此我们可以将脚本文件以.sh结尾。

可以使用Micro创建一个类似script.sh的文件micro script.sh,创建好脚本文件后就可以在文件内用脚本语言要求的格式编写脚本程序了。此外,还可以使用touch命令先创建一个空文件touch script.sh。

在创建的脚本文件中输入以下代码并保存退出。#!/bin/bashecho "hello world!"

然后添加脚本文件的可执行运行权限:# chmod +x script.sh

运行文件./script.sh,结果如下:hello world!

Shell脚本中用“#”表示注释,相当于C语言的“//”注释。但如果“#”位于第一行开头并且是“#!”(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。每个脚本程序必须在开头包含Shebang语句。

例如,使用参数n检查语法错误:# bash -n ./test.sh

如果Shell脚本中有语法错误,则会提示错误所在行;否则不输出任何信息。

智能系统需要根据不同的外部情况做出不同的处理,所以需要使用流程控制语句。下面简单介绍一下if和case语句。

if语句的语法如下:if [ condition ] then command1

elif#和else if等价: then command2 else default-command fi

说明:这里的fi是if反过来写的。

例如,为了判断某个命令是否存在,可以使用以下格式:if which programname >/dev/null; then echo existselse echo does not existfi

如判断Yum是否存在:if which yum >/dev/null; then echo "exists"else echo "does not exist"fi

case语句的语法如下:case 字符串 in 模式1) 语句 ;; 模式2) 语句 ;; *) 默认执行的语句 ;;esac

这里的esac就是case反过来写。例如:extension="png"case "$extension" in "jpg"|"jpeg") echo "It's image with jpeg extension." ;; "png") echo "It's image with png extension." ;; "gif") echo "Oh, it's a giphy!" ;; *) echo "Woops! It's not image!" ;;esac

这里使用“|”把jpg和jpeg这两个模式连接到了一起。1.2.4 在Linux下使用Java

本节首先安装JDK,然后介绍如何在Linux终端开发Java程序。

使用wget下载JDK安装包:#wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm

然后使用RPM安装JDK,命令如下:# rpm -i ./jdk-8u131-linux-x64.rpm

验证Java安装是否成功,输入如下命令:#java –version

如果安装成功,则输出如下结果:java version "1.8.0_131"Java(TM) SE Runtime Environment (build 1.8.0_131-b11)Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

为了自动构建Java源代码,需要安装Maven。首先下载Maven安装文件:# wget http://mirrors.shuosc.org/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz

然后解压安装文件:# tar -xzf apache-maven-3.5.2-bin.tar.gz

把安装路径改成/usr/local/apache-maven:# mv apache-maven-3.5.2 /usr/local/apache-maven

修改配置文件/etc/profile设定变量MAVEN_HOME的值,并把mvn所在的路径加入到PATH变量中,也就是增加如下命令行:export MAVEN_HOME=/usr/local/apache-mavenexport PATH=$MAVEN_HOME/bin:$PATH

然后安装Gradle。首先下载安装文件gradle-3.5-bin.zip:# wget https://services.gradle.org/distributions/gradle-3.5-bin.zip

创建Gradle软件存放的路径:# mkdir /opt/gradle

解压缩gradle-3.5-bin.zip到/opt/gradle目录下:# unzip -d /opt/gradle gradle-3.5-bin.zip

检查解压缩出来的文件:# ls /opt/gradle/gradle-3.5LICENSE NOTICE bin getting-started.html init.d lib media

把gradle所在的路径加入到PATH变量中:export PATH=$PATH:/opt/gradle/gradle-3.5/bin

在Linux终端输入以下命令验证是否成功安装:# gradle –v1.2.5 Eclipse集成开发环境

就像做实验有专门的试验台,开发软件也有专门的集成开发环境。开发Java程序最流行的工具是Eclipse(网址是http://www.eclipse.org)。

Eclipse也有很多版本,可以选择最简单的一个版本Eclipse IDE for Java Developers。Eclipse是绿色软件,无须安装,解压后就可以直接使用,在Windows下,双击后就可以解压文件。如果需要专门的解压软件,推荐使用7z(网址是http://www.7-zip.org/)。

Eclipse默认是英文界面,如果读者习惯用中文界面的话可以从这个网站http://www.eclipse.org/babel/downloads.php中下载支持中文的语言包。

Eclipse把软件按项目进行管理,每个项目都有自己的.classpath文件,指定了源代码路径,编译后将输出文件的路径及该项目引用的jar包的路径。一个简单的.classpath文件内容如下:

为了方便在其他计算机上正常开发,classpathentry中的路径一般使用相对路径而不是绝对路径。如果是绝对路径,也可以将文件路径手动修改为相对路径。

安装Eclipse的Gradle插件。首先从https://github.com/eclipse/buildship网站中找到安装地址,然后把文件解压缩到eclipse\dropins目录下就可以了;也可以在Eclipse界面上安装,选择菜单栏的“帮助”|“安装新软件”命令,然后输入插件地址即可。1.3了解Elasticsearch

Elasticsearch把输入文档和复杂的查询语法及输出的查询结果都封装成了XContent,这样数据就可以采用XML或者JSON格式表示成可读的形式。JSON表示形式更简短,所以Elasticsearch采用JSON格式来表示XContent。因为要使用JSON和Elasticsearch服务端打交道,所以本节将介绍JSON。1.3.1 JSON数据格式

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,不仅易于人们阅读和编写,而且也易于计算机解析和生成,可以用它传输由名称/值对和数组数据类型组成的数据对象。一些结构复杂的数据也可以采用JSON格式来表示,如散列表中的值就是数组。

JSON的基本数据类型介绍如下。

·数字:有符号的十进制数字,可能包含小数部分,也可能使用指数E表示法,但不能包括非数字,如NaN。该格式不区分整数和浮点数。

·字符串:0个或多个Unicode字符的序列。字符串用双引号分隔,并支持反斜杠转义语法。

·布尔值:为true或false的任一值。

·数组:0个或多个值的有序列表,每个值可以是任何类型。数组使用方括号符号,元素以逗号分隔。

·对象:名称/值对的无序集合,其中名称(也称为键)是字符串。由于对象旨在表示关联数组,推荐每个键在对象内是唯一的。对象用大括号分隔,并使用逗号分隔每对,而在每一对中,用冒号(:)将键或名称与其值分隔开。

·null:一个空值,使用单词null。

一个表示Elasticsearch版本的对象如下: "version" : { "number" : "5.3.0", "build_hash" : "3adb13b", "build_date" : "2017-03-23T03:31:50.652Z", "build_snapshot" : false, "lucene_version" : "6.4.1" }

可以使用Elasticsearch提供的API构建JSON串。

例如,在Eclipse中创建一个Gradle项目,首先引入jackson相关的jar包,然后在build.gradle文件中增加依赖库:runtime group: 'org.elasticsearch', name: 'elasticsearch', version: '5.6.2'

最后运行如下代码:XContentBuilder b = XContentFactory.jsonBuilder().startObject();b.field("title", "新闻标题");b.field("body", "内容");b.endObject();// 从XContent到JSONString json = b.bytes().utf8ToString();System.out.println(json);

输出结果如下:{"title":"新闻标题","body":"内容"}1.3.2 Elasticsearch基本概念

Lucene是由一个Java语言开发的开源全文检索引擎工具包。把Lucene用Netty封装成服务,使用JSON访问就是Elasticsearch。

Elasticsearch内置了对分布式集群和分布式索引的管理,所以相对Solr来说,不需要额外安装ZooKeeper,其更容易分布式部署。使用Elasticsearch的搜索系统整体架构图如图1-1所示。图1-1 Elasticsearch的外部结构

Elasticsearch的每一个运行实例称为一个节点,既可以在同一台计算机上运行多个实例,也可以在每台计算机上只运行一个实例。

在一个分布式系统里,多个Elasticsearch运行实例可以组成一个集群(cluster),该集群里有一个动态选举出来的主节点(master)。如果主节点失败,会自动选出新的节点作为主节点,所以不存在单点故障。

在同一个子网内,只需要在每个节点上设置相同的集群名,这些集群名相同的节点会自动组成一个集群。Elasticsearch包含了节点和节点之间通信模块及节点之间的数据分配和平衡模块。

为了实现容错,Elasticsearch会把查询文档集合分解为多个小的索引,每一个小的索引就叫做分片(shards)。每一个分片都可以有0到多个副本(replicas),而每一个副本也都是分片的完整复制品,这样也提高了查询速度。

一旦Elasticsearch的某个节点数据损坏或服务不可用的时候,就可以用其他节点来代替坏掉的节点,以达到高可用的目的。当有节点加入或退出时,主节点会根据机器的负载对索引分片进行重新分配,当“挂掉”的节点再次重新启动的时候也会进行数据恢复(recovery)。

Elasticsearch通过网关(Gateway)来管理集群恢复,可以配置群集需要加入多少个节点才能启动恢复数据。网关配置用于恢复任何失败的索引。当节点崩溃并重新启动时,Elasticsearch将从网关读取所有的索引和元数据。

Transport代表Elasticsearch内部的节点或者集群与客户端之间的交互方式,默认使用TCP协议进行交互,同时支持HTTP协议(JSON格式)、thrift、Servlet、Memcached、ZeroMQ等多种的传输协议(通过插件方式集成)。

为了让集群在运行时动态附加额外的功能,可以使用插件机制加载实现公共接口的程序集。Elasticsearch插件用于以各种特定的方式扩展基本的Elasticsearch功能。1.3.3 HTTP协议

客户端通过HTTP协议和Elasticsearch服务器打交道。客户端发起一个到服务器上指定端口的HTTP请求,服务器端按指定格式返回网页或者其他网络资源,如图1-2所示。图1-2 HTTP协议示意图

就像发快递需要收件人的地址一样,打开网页也需要知道网络资源的地址。URI包括URL和URN,但是URN并不常用,也很少有人知道URN。URL由3部分组成,如图1-3所示。

需要使用DNS把主机名转换成IP地址,如果没有配置DNS则不能根据域名打开网站。

HTTP协议传输的内容一般是超文本,但也可以是图像等,所以还需要头信息来描述内容的格式等信息。为了容易理解,协议头使用文本描述而不是二进制格式。

客户端向服务器发送的请求头包含请求的方法、URL、协议版本及请求修饰符、客户信息和内容等。服务器以一个状态行作为响应,相应的内容包括消息协议的版本、成功或者错误编码、服务器信息、实体元信息及实体内容等。图1-3 URL分为3部分

HTTP请求格式如下:[]

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源及使用的HTTP版本;紧接着是头信息(header),用来说明服务器要使用的附加信息。头信息之后是一个空行,在此之后可以添加任意的数据,这些附加的数据称为主体(body)。

HTTP规范定义了8种可能的请求方法。客户端经常用到GET和POST,分别说明如下。

·GET:检索URI中标识资源的一个简单请求。例如,客户端发送请求GET/_cluster/health HTTP/1.1。

·POST:服务器接收被写入客户端输出流中的数据请求,可以用POST方法来提交查询词等参数。

介绍完客户端向服务器的请求消息后,我们再来了解一下服务器向客户端返回的响应消息。这种类型的消息也是由一个起始行、一个或者多个头信息、一个指示头信息结束的空行和可选的消息体组成。

HTTP的头信息包括通用头、请求头、响应头和实体头4个部分,每个头信息由一个域名、冒号(:)和域值3部分组成。域名与大小写无关,域值前可以添加任何数量的空格符,头信息可以被扩展为多行,在每行开始处使用至少一个空格或制表符,如图1-4所示。

例如,客户端发出GET请求:GET /_cluster/health HTTP/1.1

服务器返回响应:HTTP/1.1 200 OKcontent-encoding: gzipcontent-type: application/json; charset=UTF-8transfer-encoding: chunked { "active_primary_shards": 0, "active_shards": 0, "active_shards_percent_as_number": 100.0, "cluster_name": "es-catalog", "delayed_unassigned_shards": 0, "initializing_shards": 0, "number_of_data_nodes": 3, "number_of_in_flight_fetch": 0, "number_of_nodes": 3, "number_of_pending_tasks": 0, "relocating_shards": 0, "status": "green", "task_max_waiting_in_queue_millis": 0, "timed_out": false, "unassigned_shards": 0}图1-4 HTTP请求信息格式

在服务器返回的响应中,第一行中的200就是一个状态码,状态码是一个3位数字的结果代码,爬虫可以用状态码识别Elasticsearch服务器处理的情况。状态码的第一位数字定义响应的类别,后两位数字有分类的作用。例如:

·1xx,信息响应类,表示接收到请求并且继续处理。

·2xx,处理成功响应类,表示动作被成功接收、理解和接受。

·3xx,重定向响应类,为了完成指定的动作,必须接受进一步处理。

·4xx,客户端错误,客户请求包含语法错误或者不能正确执行。

·5xx,服务端错误,服务器不能正确执行一个正确的请求。

完整的状态码如表1-1所示。表1-1 HTTP常用状态码

如果请求的地址不存在,则返回404状态码。1.4Elasticsearch安装和配置

本节首先介绍如何在Windows和Linux系统下安装Elasticsearch,然后介绍将Elasticsearch作为一个系统服务自动启动的方法。1.4.1 安装Elasticsearch

若在Windows系统下安装Elasticsearch,可以从网址http://www.elasticsearch.org/download/上下载安装包。这里使用的版本为5.1.2,得到的下载文件是elasticsearch-5.1.2.zip。

然后将下载的文件解压至某个目录下,如D:\elasticsearch-5.1.2。解压后的文件中,bin是运行的脚本,config是设置文件,lib中放依赖的包。到目录D:\elasticsearch-5.1.2\bin下,运行elasticsearch.bat。

如果显示Java虚拟机内存不够,则可以在D:\elasticsearch-5.1.2\config\jvm.options配置文件中调整内存大小。其中,Xms参数表示堆空间的初始值,Xmx参数表示堆空间的最大值,应该把最小和最大JVM堆设置成相同的值。例如:-Xms2g-Xmx2g

成功启动Elasticsearch后,在浏览器中输入网址http://localhost:9200/。启动成功后,会在解压目录下增加两个文件夹:data文件夹件用于存储索引数据,logs文件夹用于日志记录。因为创建索引较耗时,所以文档会被预先写入到一个日志目录中。

用户通过HTTP协议发送指令和Elasticsearch交互,可以用命令行工具CURL发送GET或者POST命令与Elasticsearch打交道。Linux默认已经安装了CURL命令行工具,但是也有Windows版本的CURL,可以从网站http://www.paehl.com/open_source/上下载一个编译好的curl.exe文件,然后在Windows命令行下使用cmder命令行工具运行这个工具。

默认情况下Elasticsearch的RESTful服务只有本机才能访问,也就是说无法从主机访问虚拟机中的服务。为了方便调试,可以修改config/elasticsearch.yml文件,加入以下两行命令:http.host: 0.0.0.0transport.host: 127.0.0.1echo >> ./elasticsearch.yml http.host: 0.0.0.0echo >> ./elasticsearch.yml transport.host: 127.0.0.1

但线上环境切忌不要这样配置,否则任何人都可以通过这个接口修改Elasticsearch中的数据。

为了能看到索引内容,需要安装head插件。Elasticsearch 5.x安装head插件需要随同Node.js一起安装包管理工具npm。下面介绍在Linux下的安装方法,首先安装JDK。

使用默认环境启动Elasticsearch时可能会出现一些错误,所以需要进行一些设置。准备好Elasticsearch所需要的Linux操作系统环境,根据需要增加打开文件和进程的数量及虚拟内存数量。

编辑limits.conf文件:# vi /etc/security/limits.conf

添加如下内容:* soft nofile 65536* hard nofile 131072* soft nproc 2048* hard nproc 4096

增大进程数的限制。然后编辑CentOS操作系统中的配置文件90-nproc.conf:# vi /etc/security/limits.d/90-nproc.conf

将如下内容:* soft nproc 1024

修改为:* soft nproc 2048

增加虚拟内存空间大小。修改配置文件sysctl.conf:# vi /etc/sysctl.conf

添加下面配置:vm.max_map_count=655360

然后执行命令:sysctl -p

在Linux下不能以root用户启动Elasticsearch,所以需要先创建用户,这里创建一个名为ops的用户。# adduser ops

设置密码:# passwd ops

操作系统环境准备好之后,就可以安装Elasticsearch了。首先下载并解压缩安装包elasticsearch-5.6.2.tar.gz。$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz$ tar -xvf elasticsearch-5.6.2.tar.gz

然后执行脚本启动服务进程:# sh elasticsearch

这样会在终端以交互方式执行Elasticsearch服务进程。如果想让这个进程脱离终端运行,加上参数-d即可(./elasticsearch–d)。

对于旧版本的Linux,启动时会提示警告:unable to install syscall filter。因为Linux内核不支持secomp,导致与安全相关的过滤器安装失败。Elasticsearch默认尝试使用secomp,因此必须迁移到支持secomp的内核,或者禁用bootstrap.system_call_filter。可以忽略这个警告。

可以使用Linux下的pgrep命令判断程序是否正在运行:# pgrep java

或者使用Java提供的JPS工具进行察看。# jps24276 Jps1113 Bootstrap24701 Elasticsearch

也可以查看logs目录下的启动日志:$ cat ./elasticsearch.log

客户端通过HTTP请求与Elasticsearch打交道,HTTP请求包括请求的URL地址和HTTP命令(GET、POST)等。为了简洁而一致地描述HTTP请求,Elasticsearch文档使用CURL命令行语法,这也是在用户社区中对Elasticsearch请求的标准做法的描述。例如,通过CURL命令给本地节点发送HTTP请求:# curl -XGET 'http://localhost:9200/'

使用CURL命令行的简单搜索请求:# curl "-XPOST" "http://localhost:9200/_search" -d' { "query": { "match_all": {} } }'

当上述代码片段在控制台中执行时,使用3个参数运行CURL程序。第1个参数-XPOST意味着CURL所做的请求应该使用HTTP的POST请求;第2个参数“http://localhost:9200/_search”是请求的URL;第3个参数-d'{...}'使用-d标记来指示CURL发送跟随这个标记的HTTP POST数据。

可以用网页浏览器Links访问Elasticsearch:# links http://localhost:9200/

head插件是Elasticsearch集群的Web前端,作为一个单独的Web应用而运行。在Linux系统下安装head插件的过程有如下几步。(1)安装npm。npm是一个Node包管理和分发工具。安装命令如下:# yum install npm(2)下载elasticsearch-head。可以用git命令克隆出一个小的本地仓库。# git clone git://github.com/mobz/elasticsearch-head.git# cd elasticsearch-head(3)安装包。# npm install(4)启动npm。# npm run start

为了避免出现跨域问题,在文件elasticsearch.yml中添加如下配置:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载