文档章节

使用ElasticSearch快速搭建数据搜索服务

忆然灬
 忆然灬
发布于 2016/12/08 10:01
字数 1736
阅读 162
收藏 6
点赞 0
评论 0

1. ElasticSearch?

ElasticSearch 是最近几年Java界少有的当红炸子鸡,在Github上有19663个STAR。ES这两年在各个领域都

有极大的发展,目前看来基本上是无所不能,我想是因为它的工作是数据的存储和索引,而数据是一切程序

的本质,是基石的基石。

最简单的一个用法是搭建数据搜索服务,由于DNA是Lucence系的,很容易做Scoring和Sorting,提供

Reseful的数据接口。配合中文分词Analyzer,可以做中文的全文检索。天生是分布式的。

2. Spring Data ElasticSearch?

Spring Data ElasticSearch是Spring Data 针对ElasticSearch封装的一套框架,目前还是孵化性质,版本之

间变动特别大,其中一部分原因是ElasticSearch也在飞速变化中,直接从V2.4跳跃到V5.0。

虽然S D ES经常整个package被@Deprecate掉,但我个人觉得还是非常适合用来阅读源代码深入学习的:

初始版本聚焦核心功能,内容分支少,容易掌握 变化过程中,也了解专业程序员的设计思路及其取舍

3. 搜索服务搭建

ElasticSearch做数据存储Store、索引Index和检索Query

Spring-Data-ElasticSearch来完成”灌数据“和”取数据“的工作。

4. ES安装方法

ES的安装方法非常简单,下载最新的Bin包,解压即可!!

4.1 安装中文分词插件

插件地址 https://github.com/medcl/elasticsearch-analysis-ik/

下载ES版本对应的IK插件版本,解压到ES的plugins目录下即可。

修改config目录下配置文件elasticsearch.yml如下所示:

index.analysis.analyzer.ik.type : "ik"

index.analysis.analyzer.default.type : "ik"

4.2 安装Head插件

Head是一款非常好用的ElasticSearch数据图形化管理插件,类似于Mysql的NaviCat,安装方式非常简单:

sudo elasticsearch/bin/plugin install mobz/elasticsearch-head

插件安装方法1:

4.2.1.elasticsearch/bin/plugin -install mobz/elasticsearch-head

4.2.2.运行es

4.2.3.打开http://localhost:9200/_plugin/head/

插件安装方法2:

4.2.2.1.https://github.com/mobz/elasticsearch-head 下载zip

4.2.2.2.将zip文件移动至elasticsearch-1.0.0\plugins\并unzip解压

4.2.2.3.用mv命令修改名字elasticsearch-head为head,如有必要需对head赋777权限

4.2.2.4.运行es

4.2.2.5.打开http://localhost:9200/_plugin/head/

5. Spring Data ElasticSearch代码示例

通过注解@Document@Filed,可

以在ES中配置一个可索引的的对象。

在@Document注解中,indexName可以理解为传统关系数据库的DB Name, type可以理解为

Table Name.

@Document(indexName = "db_name", type = "table_name")

public class Item {

private String id;

@Field(analyzer = "ik", searchAnalyzer = "ik", type = FieldType.String)

private String name;

}

Spring Data Repository风格的Dao实现:

@Repository

public interface ItemDao extends ElasticsearchRepository<Item, String> {}

实现索引和查询的简单代码示例:

@Service

public class ItemService {

@Autowired private ItemDao itemDao;

@Autowired private ElasticsearchTemplate et;

public void indexItem() {

Item item = new Item("id", "name");

// 配合注解,一句话实现索引 itemDao.save(item); }

public Page<Item> search(String word, int page, int pageSize) {

// ES原生的模糊查询API SDE中

CriteriaQuery.Contains的实现 QueryBuilder queryBuilder =

queryStringQuery(word).

field("name").

analyzeWildcard(true).

boost(2f); SearchQuery searchQuery = new

NativeSearchQueryBuilder(). withQuery(queryBuilder). withPageable(new PageRequest(page,

pageSize)). withMinScore(0.01f). build();

return et.queryForPage(searchQuery, Item.class); } }

附录: Spring Data ElasticSearch 源码阅读笔记

基本上看到这里,使用上已经足够,下面这些是我当时读源码时的一些笔记,比较散乱,感兴趣的可以看看。

1. 源码目录结构

五个主要package,分别是

**annotations:**各种注解,主要用到的是@Document 和 @Field

**client:**NodeClient 和 TransportClinet,用后者,前者是个玩具

**config:**配置包,随便看看

**core:**核心包,Query和Index主要功能包,重点看

repository: spring data的repository接口包,主要是和ES交互,随便看看

2. Core 包

2.1 Query 接口

Query 有两个直接子接口: SeachQuery 和抽象类 AbstractQuery,且两者有个共同的实现类

NativeSearchQuery,这个类需要重点关注下。

SearchQuery里的Facet 被干掉了,暴露了Query和Filter的builder。同时暴露了HightlightFileds,

ScriptFields,IndexBoost之类的细节。

抽象类AbstractQuery implements Query 接口. (没有一个方法是Abstract的,理论上已经完全实现

Query接口)

StringQuery,AbstractQuery的一个子类,增加了一个属性,Source。打酱油的,可以忽略。

AbstractQuery的子类:CriteriaQuery,非常重要的一个类。封装一个Fluent API Style的Criteria,能做

where, and, or, is, contains, startsWith, endsWith, not, contains, expression …… 等各种常用操作。

2.1.2 Criteria类

标准Spring Data风格的Criteria查询基础类

构造函数管理的对象是Field(只有一个属性name),还会有个Arraylist的CriteriaChain,存储一系列的

CriteriaEntry用来生成查询语句

OrCriteria用来处理“或”条件,继承自Criteria,区别是 override 了 ConjunctionOperator

Criteria的contains,startsWith,endsWith等方法, 参数不接受空格

not方法,是将negating参数置为true

Criteria还支持Location GeoBox Bounding Box 查询(厉害,经纬度的查询)

CriteriaEntry的实现原理是转换成原生的ElasticSearch Query Java API,转换介质是枚举变量

public enum OperationKey {

EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, EXPRESSION, BETWEEN, FUZZY, IN, NOT_IN, WITHIN,

BBOX, NEAR, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL;

}

boost 是干啥的? postive hit with given factor

filter是干啥的? 用在Geo Location(地理信息)的查询中

2.1.3 CriteriaQuery类

封装了Criteria,没啥好说的。

2.1.4 NativeSearchQuery

它封装了ES里的QueryBuilder和SortBuilder,因此可以将Spring Data风格的Query转换过ElasticSearch

的原生Query API,想要实现高度定制化的查询,全靠这个类。Spring Data ES提供有配套Builder.

2.1.5 ElasticSearchTemplate

继承自ElasticsearchOperations接口,是标准的Spring Data风格封装。

2.1.5.1 ElasticsearchOperations

主要包含以下几个方面的功能

索引的 创建

Mapping的创建(对indexName(database)和 Type (table)的Mapping,目前不知道是干啥的)

获取IndexName的Setting (数据格式是一个map)

常规的QueryForObject, QueryForPage等操作

count, multiGet

update, index, delete

scan, scroll

几个特殊的Query:MoreLikeThisQuery,AliasQuery

2.1.5.2 EST的实现

封装了一个ES的Client, 能完成index,mapping,setting相关的request请求

2.1.5.3 queryForPage实现

创建Query和Filter两个QueryBuilder(ES的),其中Query用于普通字段的查询,Filter用于Geo Location

数据的查询。

Query-QuerBuidler里是根据CriteriaEntry和前面列举的枚举变量OperationKey转换成ES原生的

queryStringQuery,rangeQuery,fuzzyQuery,boolQuery等

然后用一个BoolQueryBudiler(ES原生)把第2步生成的全部Query串起来。

辅助设置一下参数,例如SourceFilter,Pageable(转换成ES原生的起始点选择),sort,minscore之类的。

2.1.5.4 Scan实现

可以用来完成超大数据量的Scan && Scroll 暂时用不到,但数据规模到一定规模时,应该有用。(观察下Jest里的实现)

3. 结论

结合Spring和注解,在POJO上利用Document和Filed注解,然后结合Repository风格的Dao,可以非常有

效的创建索引。 (save方法,推荐这么使用)

一些简单的、常规的查询,推荐使用CriteriaQuery,配合EST

复杂的、自定义的、得分排序等等高阶查询,需要是用SearchQuery集成ES原生的各种

TermQuery、RangeQuery等。(所以还是要认真学下ES的原生JAVA API)

© 著作权归作者所有

共有 人打赏支持
忆然灬
粉丝 2
博文 45
码字总数 42201
作品 0
东城
架构师
基于ELK实时日志分析的最佳实践

在2018云栖大会深圳峰会大数据分析与可视化专场上,由阿里巴巴搜索引擎事业部开放搜索团队的吴迪带来了“基于ELK实时日志分析的最佳实践”的主题分享。介绍了传统的日志分析、ELK的概念和ELK...

smile小太阳 ⋅ 05/06 ⋅ 0

Elasticsearch 5.5.1的安装和入门教程(转)

说明:转自老阮的文章,业界最简单的入门教程。一切的安装的运行建议不要用root权限,最好是当前用户下的权限。 作者: 阮一峰 日期: 2017年8月17日 全文搜索属于最常见的需求,开源的 Elas...

easonjim ⋅ 01/21 ⋅ 0

Elasticsearch中文分词研究

一、ES分析器简介 ES是一个实时搜索与数据分析引擎,为了完成搜索功能,必须对原始数据进行分析、拆解,以建立索引,从而实现搜索功能; ES对数据分析、拆解过程如下: 首先,将一块文本分成...

zhaipengfei1231 ⋅ 04/18 ⋅ 0

ElasticSearch2.3.3离线搭建(windows+Linux)

1、ElasticSearch介绍 ElasticSearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch 是用Java开发的,并作为Apache许可条...

Coder2018 ⋅ 2017/05/23 ⋅ 3

Docker下ELK三部曲之三:K8S上的ELK和应用日志上报

本章是《Docker下ELK三部曲》系列的终篇,前面章节已经详述了ELK环境的搭建以及如何制作自动上报日志的应用镜像,今天我们把ELK和web应用发布到K8S环境下,模拟多个后台server同时上报日志的...

boling_cavalry ⋅ 04/30 ⋅ 0

CTO详细讲解海量日志处理ELK

ELK实时日志分析平台之Elasticsearch简介 Elasticsearch是一个高度灵活的开源全文检索和分析引擎。它能够迅速(几乎是实时地)地存储、查找和分析大规模数据。通常被用在有复杂的搜索要求的系...

Java架构分享 ⋅ 05/23 ⋅ 0

使用阿里云Elasticsearch搭建ELK日志系统

1. 搭建专用网络 1.1 登录专有网络管理控制台 阿里云Elasticsearch是搭建在专有网络上的,所以我们先开通阿里云专有网络, 点击开通 . 1.2 创建专有网络 点击创建专有网络 在专有网络名称和交...

pcdog ⋅ 05/21 ⋅ 0

当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群 ⋅ 04/15 ⋅ 0

ELK 系统在中小企业从0到1的落地实践

ELK 简介 ELK 是一般被称作日志分析系统,是三款开源软件的简称。通常在业务服务上线后我们会部署一套 ELK 系统,方便我们通过图形化界面直接查找日志,快速找到问题源并帮助解决问题。 Elas...

wang123459 ⋅ 04/11 ⋅ 0

Docker下ELK三部曲之一:极速体验

《Docker下ELK三部曲》一共三篇文章,为您揭示如何快速搭建ELK环境,以及如何将web应用的日志上报到ELK用,三部曲内容简述如下: 1. 极速体验ELK服务,即本章的内容; 2. 细说技术详情,例如...

boling_cavalry ⋅ 04/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 39分钟前 ⋅ 0

彻底删除Microsoft Office的方法

参照此链接彻底删除Office https://support.office.com/zh-cn/article/%e4%bb%8e-pc-%e5%8d%b8%e8%bd%bd-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-CN&rs=zh-CN&ad=CN......

Kampfer ⋅ 54分钟前 ⋅ 0

大盘与个股之间关系

大盘走多:积极出手 顺势加码 大盘走空: 少量出手 退场观望 大盘做头:逆势减码 少量操作 大盘做底 : 小量建仓 小量试单

guozenhua ⋅ 56分钟前 ⋅ 0

Day16 LVM(逻辑卷管理)与磁盘故障小案例

lvm详解 简述 LVM的产生是因为传统的分区一旦分区好后就无法在线扩充空间,也存在一些工具能实现在线扩充空间但是还是会面临数据损坏的风险;传统的分区当分区空间不足时,一般的解决办法是再...

杉下 ⋅ 今天 ⋅ 0

rsync实现多台linux服务器的文件同步

一、首先安装rsync,怎样安装都行,rpm,yum,还是你用源码安装都可以。因为我用的是阿里云的ESC,yum install rsync就ok了。 二、配置rsync服务 1.先建立个同步数据的帐号 123 groupadd r...

在下头真的很硬 ⋅ 今天 ⋅ 0

前端基础(三):函数

字数:1685 阅读时间:5分钟 函数定义 在最新的ES规范中,声明函数有4中方法: -函数声明 -函数表达式 -构造函数Function -生成器函数 1.函数声明 语法: function name([param[, param2 [....

老司机带你撸代码 ⋅ 今天 ⋅ 0

Java虚拟机的Heap监狱

在Java虚拟机中,我是一个位高权重的大管家,他们都很怕我,尤其是那些Java 对象,我把他们圈到一个叫做Heap的“监狱”里,严格管理,生杀大权尽在掌握。 中国人把Stack翻译成“栈”,把Hea...

java高级架构牛人 ⋅ 今天 ⋅ 0

Spring MVC基本概念

只写Controller

颖伙虫 ⋅ 今天 ⋅ 0

微软重金收购GitHub的背后逻辑原来是这样的

全球最大的开发者社区GitHub网站花落谁家的问题已经敲定,微软最终以75亿美元迎娶了这位在外界看来无比“神秘”的小家碧玉。尽管此事已过去一些时日,但整个开发者世界,包括全球各地的开源社...

linux-tao ⋅ 今天 ⋅ 0

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部