这个世界已然被数据淹没。多年来,我们系统间流转和产生的大量数据已让我们不知所措。 现有的技术都集中在如何解决数据仓库存储以及如何结构化这些数据。 这些看上去都挺美好,直到你实际需要基于这些数据实时做决策分析的时候才发现根本不是那么一回事。
Elasticsearch是一款十分强大的开源搜索引擎,可以帮助你在海量数据中搜索到目标,使用机器学习自动发现异常数据,对数据报表等强大功能。
在大数据的时代,掌握强大的实时搜索和分析能力,才能掌握核心竞争力。
如果你使用过Github的搜索功能,应该会深有体会Elasticsearch的强大,从近百亿代码中快速对你的关键词进行匹配,
相比于Hadoop,ES具有更高的性能,而且很容易进行扩展和安装。
环境搭建
ES需要使用Java的开发环境,所以需要配置JDK环境变量(这个不用多说了吧)。
然后解压ES安装包,在cmd中进入ES的bin目录下,执行elasticsearch.bat
即可。
ES使用了9200端口,可以在本地访问localhost:9200来查看。
它会返回当前ES的节点信息。
ES的操作都是基于REST API的,我们可以使用一个可视化工具Kibana。
同样也是解压,然后在bin目录下执行kibana.bat
。
访问localhost:5601
就可以进入管理平台。
索引是文档的容器,存放一类文档的集合,类似于数据库中表的概念,里面存放了一条条的数据。
在开发工具DEV Tool中我们可以操作索引。
文档的CRUD
类似于数据库,ES中也存在了CRUD操作,每一条记录就是一条文档。
操作存在Index,Create,Update,Delete,Read。
Index和Create都是创建一条文档,不过Index的意思是索引(动词),如果文档已存在,就删除现有的,再重新创建,版本增加。Create可以自己制定文档ID,如果ID存在,就会失败,如果不存在,就创建新的文档。
Index和Create请求方式有点绕,最好还是自己在DEV Tool中测试一下。
Update方法必须文档已经存在,对文档字段进行增量更新,添加字段或修改字段内容,并且版本号增加。
Read方法比较简单,只需要用GET请求来指定文档ID即可,如上图。
Delete方法类似于Read,指定文档ID即可。
Elasticsearch分词
ES有一个非常强大的功能,就是内置分词器,支持数十个国家的语言。
Analysis,文本分析,把全文本转化为一系列单词,基于Analyzer实现。
ES中有多种分词器,standard是按词切分,将单词切分成单个token。
simple会根据非字母的单词进行拆分,并进行大小写转换。
whitespace会按照空格来进行拆分,不做其他处理。
stop想必simple Analyzer会把the,is,a等修饰词去除。
keyword会直接把一个输入当做输出来处理。
pattern是通过正则表达式进行分词,默认按照\W非字母的符号进行分割,并进行大小写转换。
Search-API
在ES中使用Search有多种方法,一种是把参数带在URL中使用GET方法请求的URI Search,另一种是把请求参数以JSON格式放在Body中的请求方式。
在search时,需要在URL中使用/_search
来请求。
- URI Search
使用q来指定查询字符串,df指定要查询的字段,不指定df会默认对所有字段进行查询。
sort指定根据哪个字段排序,from和size用于分页,profile可以查看search是如何执行的。
也可以不加df字段,直接使用?q=title:java
来指定字段。
q字段查询的条件如果是两个单词,比如说Java Blog
,如果要求查询结果中连续的话,就需要在查询时用引号包住。
?q=title:"Java Blog"
, Java AND Blog。?q=title:Java Blog
, title:Java OR 其他字段:Blog。?q=title:(Java Blog)
,title:Java OR title:Blog。?q=title:(Java -Blog)
,title:Java OR title:Blog。
- Request Body Search
Request Body Search可以做比URI Search更高级的操作。
match_all查询所有。
可以使用match进行匹配查询。
如下默认是java or python。
如果要指定and和or条件,可以指定operator。