1. Java语言全文检索技术简介
什么是lucene?
Lucene是一套 “全文检索” 编程API ,基于Lucene对数据建立索引,进行查询。
很多框架对lucene进行了封装。
什么是ElasticSearch ?
现在企业开发中,更常用是的solr搜索服务器和ElasticSearch搜索服务器
如果大家使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在你需要扩展基于 Lucene 或 Solr 的解决方案时,你就会了解 Elasticsearch 项目背后的动机。Elasticsearch(构建于 Lucene 之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。你可以通过标准的 REST API 或从特定于编程语言的客户端库与 Elasticsearch 进行交互。
本教程将展示 Elasticsearch 的实际工作原理。首先了解命令行访问该 REST API 来了解它的基本信息。然后设置一个本地 Elasticsearch 服务器,并使用Java 应用程序与它交互。
2. ElasticSearch 安装配置使用入门
对于 Java 示例,还需要安装 Eclipse 和 Apache Maven。如果你的系统上还没有它们,请下载和安装它们。
官网: https://www.elastic.co/products/elasticsearch
Window系统下载zip版本,linux系统下载tar版本
下载后的页面
bin 存放elasticSearch 运行命令
config 存放配置文件
lib 存放elasticSearch运行依赖jar包
modules 存放elasticSearch 模块
plugins 存放插件
运行elasticSearch/bin/elasticsearch.bat 文件
配置JAVA_HOME环境变量
访问 http://127.0.0.1:9200
安装elasticSearch成功
将Elasticsearch注册到windows的服务上,不用每次启动Elasticsearch
安装:install
启动:start
停止:stop
卸载:remove
管理:manager
配置:查找jdk的绝对路径
3. ElasticSearch 插件安装 es head
es head:
elasticsearch-head插件
插件安装方法:
方案一:联网的情况下,可以使用plugin命令。
1.elasticsearch/bin/plugin.bat -install mobz/elasticsearch-head
2.运行es
3.打开http://localhost:9200/_plugin/head/
方案二:可以直接在git上下载源码到本地运行。
在地址栏输入es服务器的ip地址和端口,点connect就可以连接到集群。下面是连接后的视图。这是主界面,在这里可以看到es集群的基本信息(如:节点情况,索引情况)
【方案一】:联网下载
%elasticsearch%/bin/plugin.bat install mobz/elasticsearch-head
下载插件:
访问 http://localhost:9200/_plugin/head/
【方案二】:下载解压
1、插件下载地址
https://github.com/mobz/elasticsearch-head
2、安装方法:
将下载下的zip文件,解压缩到plugins/head目录下
目录路径如下:elasticsearch-2.4.0/plugins/head/
3、启动es bin/elasticsearch
4、访问集群
浏览器地址栏输入http://localhost:9200/_plugin/head/
5、显示结果如下图
4. ElasticSearch 基本操作入门
推荐书籍 :
《Elasticsearch服务器开发(第2版).pdf 》
《Elasticsearch权威指南(中文版).pdf》
全文检索: 针对文本中每个词,创建词条建立索引,进行搜索。
倒排索引:
也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
倒排列表:
倒排列表用来记录有哪些文档包含了某个单词。一般在文档集合里会有很多文档包含某个单词,每个文档会记录文档编号(DocID),单词在这个文档中出现的次数(TF)及单词在文档中哪些位置出现过等信息,这样与一个文档相关的信息被称做倒排索引项(Posting),包含这个单词的一系列倒排索引项形成了列表结构,这就是某个单词对应的倒排列表。
ElasticSearch 操作服务器上的数据,通过 Rest API 操作数据
Elasticsearch可以作为一个独立的单个搜索服务器。不过,为了能够处理大型数据集,实现容错和高可用性,Elasticsearch可以运行在许多互相合作的服务器上。这些服务器称为集群(cluster),形成集群的每个服务器称为节点(node)。
如果操作Elasticsearch上数据,访问提供Rest API的URL地址,传递json数据给服务器
4.1. ElasticSearch 基础 数据架构的主要概念
索引对象(blob): 存储数据的表结构 ,任何搜索数据,存放在索引对象上 。
映射(mapping): 数据如何存放到索引对象上,需要有一个映射配置, 包括:数据类型、是否存储、是否分词 … 等。
文档(document): 一条数据记录, 存在索引对象上
文档类型(type): 一个索引对象 存放多种类型数据,数据用文档类型进行标识
【后续编程】:
第一步:建立索引对象
第二步:建立映射
第三步:存储数据【文档】
第四步:指定文档类型进行搜索数据【文档】
4.2. Elasticsearch与Mysql对比
Elasticsearch 集群可以包含多个索引(Index),每个索引可以包含多个类型(Type),每个类型可以包含多个文档(Document),每个文档可以包含多个字段(Field)。以下是 MySQL 和 Elasticsearch 的术语类比图,帮助理解:
就像使用 MySQL 必须指定 Database 一样,要使用 Elasticsearch 首先需要创建 Index:
client.indices.create({index : ‘blog’});
这样就创建了一个名为 blog的 Index。Type 不用单独创建,在创建 Mapping 时指定就可以。Mapping 用来定义 Document 中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。创建 Mapping 的代码示例如下:
client.indices.putMapping({
index : ‘blog’,
type : ‘article’,
body : {
article: {
properties: {
id: {
type: ‘string’,
analyzer: ‘ik’,
search_analyzer: ‘ik’,
},
title: {
type: ‘string’,
analyzer: ‘ik’,
search_analyzer: ‘ik’,
},
content: {
type: ‘string’,
analyzer: ‘ik’,
search_analyzer: ‘ik’,
}
}
}
}
});
5. CURL命令操作执行REST命令
要理解本教程的所有示例,需要在你的系统上安装 Elasticsearch。下载针对你的平台的 最新 Elastic Search 程序包。将该包解压到一个方便的位置。
在 Windows 上,运行elastic-search-dir/bin/elasticsearch.bat
5.1. Windows安装CURL
第一步:工具下载:
在官网处下载工具包:http://curl.haxx.se/download.html
下载后:
为了方便运行,不出现中文路径。
第二步:安装
【使用方式一】:在curl.exe目录中使用
解压下载后的压缩文件,通过cmd命令进入到curl.exe所在的目录。
进入到该目录后,执行curl --help测试:
【使用方式二】:放置在system32中
解压下载好的文件,拷贝curl.exe文件到C:\Windows\System32
然后就可以在DOS窗口中任意位置,使用curl命令了。
【使用方式三】:配置环境变量(推荐)
在系统高级环境变量中,配置
CURL_HOME ----- “你的curl目录位置”
path ---- 末尾添加 “;%CURL_HOME%;”
这样与上面方式二的效果相同。
可以对 Elasticsearch 发出 CURL 请求,这样很容易从命令行 shell 体验该框架。
Elasticsearch 是无模式的,这意味着它可以接受你提供的任何命令,并处理它以供以后查询。Elasticsearch 中的所有内容都被存储为文档,所以你的第一个练习是存储一个包含博客的文档。首先创建一个索引,它是你的所有文档类型的容器 — 类似于 MySQL 等关系数据库中的数据库。然后,将一个文档插入该索引中,以便可以查询该文档的数据。
5.2. 创建一个索引
Elasticsearch 命令的一般格式是:REST VERBHOST:9200/index/doc-type— 其中 REST VERB 是 PUT、GET 或DELETE。(使用 curlL -X 动词前缀来明确指定 HTTP 方法。)
要创建一个索引,可在你的 shell 中运行以下命令:
curl -XPUT “http://localhost:9200/blog01/”
尽管 Elasticsearch 是无模式的,但它在幕后使用了 Lucene,后者使用了模式。不过 Elasticsearch 为你隐藏了这种复杂性。实际上,你可以将 Elasticsearch 文档类型简单地视为子索引或表名称。但是,如果你愿意,可以指定一个模式,所以你可以将它视为一种模式可选的数据存储。
【查看】
5.3. 插入一个文档
要在 /blog01 索引下创建一个类型,可插入一个文档。
要将包含 “Deck the Halls” 的文档插入索引中,可运行以下命令(将该命令和本教程的其他 CURL 命令都键入到一行中):
curl -XPUT “http://localhost:9200/blog01/article/1” -d “{”"“id”"": “”“1"”", “”“title”"": “”“Whatiselasticsearch”""}"
前面的命令使用 PUT 动词将一个文档添加到 /article文档类型,并为该文档分配 ID 为1。URL 路径显示为index/doctype/ID(索引/文档类型/ID)。
5.4. 查看文档
要查看该文档,可使用简单的 GET 命令:
curl -XGET “http://localhost:9200/blog01/article/1”
Elasticsearch 使用你之前 PUT 进索引中的 JSON 内容作为响应:
5.5. 更新文档
如果你认识到title字段写错了,并想将它更改为 Whatislucene 怎么办?可运行以下命令来更新文档:
curl -XPUT “http://localhost:9200/blog01/article/1” -d “{”"“id”"": “”“1"”", “”“title”"": “”“Whatislucene”""}"
因为此命令使用了相同的唯一 ID为1,所以该文档会被更新。
5.6. 搜索文档
是时候运行一次基本查询了,此查询比你运行来查找 “Get the Halls” 文档的简单 GET 要复杂一些。文档 URL 有一个内置的 _search 端点用于此用途。在标题中找到所有包含单词 lucene 的数据:
curl -XGET “http://localhost:9200/blog01/article/_search?q=title:‘Whatislucene’”
参数表示一个查询。
5.7. 检查搜索返回对象
上图中给出了 Elasticsearch 从前面的查询返回的数据。
在结果中,Elasticsearch 提供了多个 JSON 对象。第一个对象包含请求的元数据:看看该请求花了多少毫秒 (took) 和它是否超时 (timed_out)。_shards 字段需要考虑 Elasticsearch 是一个集群化服务的事实。甚至在这个单节点本地部署中,Elasticsearch 也在逻辑上被集群化为分片。在往后看可以观察到 hits 对象包含:
• total 字段,它会告诉你获得了多少个结果
• max_score,用于全文搜索
• 实际结果
实际结果包含 fields 属性,因为你将 fields 参数添加到了查询中。否则,结果中会包含 source,而且包含完整的匹配文档。_index、_type 和 _id 分别表示索引、文档类型、ID;_score 指的是全文搜索命中长度。这 4 个字段始终会在结果中返回。
5.8. 删除文档
暂时不要删除该文档,知道如何删除它就行了:
curl -XDELETE “http://localhost:9200/blog01/article/1”
5.9. 删除索引
暂时不要删除该文档,知道如何删除它就行了:
curl -XDELETE “http://localhost:9200/blog01”
6. 使用Java操作客户端(入门)
Elasticsearch 的 Java 客户端非常强大;它可以建立一个嵌入式实例并在必要时运行管理任务。
运行一个 Java 应用程序和 Elasticsearch 时,有两种操作模式可供使用。该应用程序可在 Elasticsearch 集群中扮演更加主动或更加被动的角色。在更加主动的情况下(称为 Node Client),应用程序实例将从集群接收请求,确定哪个节点应处理该请求,就像正常节点所做的一样。(应用程序甚至可以托管索引和处理请求。)另一种模式称为 Transport Client,它将所有请求都转发到另一个 Elasticsearch 节点,由后者来确定最终目标。
6.1. 新建文档(自动创建索引和映射 )
1、 需要新建 maven项目
2、 基于maven的pom 导入坐标依赖
org.elasticsearch
elasticsearch
2.4.0
junit
junit
4.12
ElasticSearch2.4.0 依赖 lucene5.5.2 版本
当直接在ElasticSearch 建立文档对象时,如果索引不存在的,默认会自动创建,映射采用默认方式
ElasticSearch 服务默认端口 9300
Web 管理平台端口 9200
获取 Transport Client调用
对于演示应用程序,(通过 App.java 中执行的初始化)选择 Transport Client,并保持 Elasticsearch 执行最低级别的处理:
这里注意:如果连接到一个 Elasticsearch 集群,构建器可以接受多个地址。(在本课程中,你只有一个 localhost 节点。)连接到端口 9300,而不是像