强大的搜索开源框架Elastic Search介绍

项目背景

近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。

Elastic Search简介

Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存储任意格式的文档和数据,同时,也可以做大数据的分析,是一个跨界开源产品。ES 有如下特点:

  • 全文搜索引擎, ES 是建立在Lucene 上的开源搜索引擎,可以用来进行全文搜索、地理信息搜索。Wikipedia、 GitHub 、StackOverFlow 等网站均使用ES
  • 文档存储和查询,可以像NoSQL 那样存储任意格式文档,井能根据条件查询文档。
  • 大数据分析, ES 号称能准确实时地进行大数据分析,数据量从TB 到PB ,国内外很多大公司都用ES 做大数据分析。
  • ES 提供了阻REST API ,用来简化对ES 的操作。因此可以使用任何语言的客户端,同时也提供Java API。
  • ES常常配合传统数据库一起使用, ES用来负责大数据的查询、搜索、统计分析。

Elastic Search安装

安装过程参考:

https://www.cnblogs.com/xxoome/p/6663993.html

(可以在文章底部点击"查看原文"来阅读进入这个连接。)

Elastic Search下载地址:

https://www.elastic.co/downloads/elasticsearch

我的相关系统版本号: 版本号: 6.3.1 jdk: 1.8 操作系统: CentOS 7.0

安装中文插件

默认Elastic Search对中文搜索不是很友好,需要安装相应的插件,安装方法:

  1. 进入elastic search安装目录,如/usr/local/elasticsearch/elasticsearch-6.3.1/bin,执行
./elasticsearch-plugin install analysis-smartcn

Elastic Search 的基本概念

ES 有一些基本概念, 掌握这些基本概念对理解ES 有很大帮助。

  1. Index, Index 是文档( Document )的集合, Index 下面包含了Type ,用于对Document进一步分类。可以理解为ES 中的Index 相当于数据库,而Type 相当于数据库中的表,ES 中可以轻易地联合Index 和Type 来搜索数据,数据库却不能。
  2. Type ,用来进一步组织Document , 一个Index 下可以有多个Type ,比如用户信息是一个Type ,用户的支付记录是一个Type 。
  3. Document , 文档是ES 能够存储和搜索的基本信息,类似数据库表行数据, Document为JSON 格式,文档属于Type 。
  4. Node (节点〉,节点是集群里的一台ES Server ,用于文档的存储和查询。应用可以只有一个节点,也可以由上百个节点组成集群来存储和搜索数据。每个节点都有一个节点名字,以及所属集群的名字。
  5. 集群,同样集群名的节点将组合为ES 集群,用来联合完成数据的存储和搜索。默认的集群名字是e lasticsearch 。 分区( Shards )和复制( Replicas ),每个Index 理论上都可以包含大量的数据,超过了单个节点的存储限制,而且,单个节点处理那么大的数据,将明显限制存储和搜索性能。为了解决这个问题, E S 会进一步将Index 在物理上细分为多个分区,而且这些分区会按照配置复制到多个节点, Index 的分区称为主分区,复制的分区称为复制分区。这样的好处是既保证数据不会丢失,又提高了查询的性能。

使用REST 访问Elastic Search示例(这里使用linux curl命令模拟http请求)

添加文档

curl  -XPOST  'http://192.168.111.130:9200/index-instance/type-instance/1?pretty ' -H  'Content-Type:application/json'  -d '
{
"name ": "携程业务名称",
"type": "department",
"postDate": "2018-07-15",
"message": "携程有很多业务,如酒店、机票、火车票、旅游、度假等"
}
'

curl  -XPOST  'http://192.168.111.130:9200/index-instance/type-instance/2?pretty ' -H  'Content-Type:application/json'  -d '
{
"name ": "携程业务名称",
"type": "department",
"postDate": "2018-07-15",
"message": "携程的酒店服务非常好。"
}
'

说明:这里增加两条记录,index-instance 表示Index , type-instance表示Type ,数字1和2是文挡的主键,主键可以是任意形式,如果未指定主键, ES 会自动生成一个唯一主键, pretty是可选的, ES 输出的时候会格式化输出结果,更加美观。

执行成功会输出:

{
  "_index" : "index-instance",
  "_type" : "type-instance",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

{
  "_index" : "index-instance",
  "_type" : "type-instance",
  "_id" : "2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

根据主键查询

curl -XGET  'http://192.168.111.130:9200/index-instance/type-instance/1?pretty'

说明: 1是主键。

如果存在结果,则返回:

{
  "_index" : "index-instance",
  "_type" : "type-instance",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name " : "携程业务名称",
    "type" : "department",
    "postDate" : "2018-07-15",
    "message" : "携程有很多业务,如酒店、机票、火车票、旅游、度假等"
  }
}

搜索文档

ES 提供了强大的搜索功能,搜索参数可以在url 后面,也可以放到body 中。使用GET 方法:

curl  -G  --data-urlencode  'q=message:机票'  'http://192.168.111.130:9200/index-instance/type-instance/_search?pretty'

说明:这里搜索“机票”,返回:

{
  "took" : 85,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.68324494,
    "hits" : [
      {
        "_index" : "index-instance",
        "_type" : "type-instance",
        "_id" : "1",
        "_score" : 0.68324494,
        "_source" : {
          "name " : "携程业务名称",
          "type" : "department",
          "postDate" : "2018-07-15",
          "message" : "携程有很多业务,如酒店、机票、火车票、旅游、度假等"
        }
      }
    ]
  }
}

再次搜索“酒店”:

curl  -G  --data-urlencode  'q=message:酒店'  'http://192.168.111.130:9200/index-instance/type-instance/_search?pretty'

返回:

{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "index-instance",
        "_type" : "type-instance",
        "_id" : "2",
        "_score" : 0.5753642,
        "_source" : {
          "name " : "携程业务名称",
          "type" : "department",
          "postDate" : "2018-07-15",
          "message" : "携程的酒店服务非常好。"
        }
      },
      {
        "_index" : "index-instance",
        "_type" : "type-instance",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "name " : "携程业务名称",
          "type" : "department",
          "postDate" : "2018-07-15",
          "message" : "携程有很多业务,如酒店、机票、火车票、旅游、度假等"
        }
      }
    ]
  }
}

使用POST搜索:

curl  -XPOST 'http://192.168.111.130:9200/index-instance/type-instance/_search?pretty'  -H 'Content-Type:application/json'  -d'
{
"query" : {
 "match": {"message": "酒店"}
 }
}
'

返回同样的结果:

{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "index-instance",
        "_type" : "type-instance",
        "_id" : "2",
        "_score" : 0.5753642,
        "_source" : {
          "name " : "携程业务名称",
          "type" : "department",
          "postDate" : "2018-07-15",
          "message" : "携程的酒店服务非常好。"
        }
      },
      {
        "_index" : "index-instance",
        "_type" : "type-instance",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "name " : "携程业务名称",
          "type" : "department",
          "postDate" : "2018-07-15",
          "message" : "携程有很多业务,如酒店、机票、火车票、旅游、度假等"
        }
      }
    ]
  }
}

注意:因为关键字中含有中文,需要curl进行url编码,所以curl使用参数--data-urlencode,参数-G表示这是一个GET请求,如果不加-G,则默认使用POST请求,则导致elastic search返回一个406不支持的POST错误请求响应。hits 包含了查询结果,在本例中, 只有2 条,_index 是index-instance , _type 是type-instance , 主键是1和2, _score 是搜索引擎概念, 表示查询相关度, 分数越高,表示此文档与关键字期望的结果的匹配程度高。

除了全文搜索,也可精确搜索,使用term进行精确搜索:

curl  -XGET 'http://192.168.111.130:9200/index-instance/type-instance/_search?pretty'  -H 'Content-Type:application/json'  -d'
{
"query": {
     "term": { "type": "department"}
 }
}
'

这里查找关键字值food。 如果需要使用翻页功能可以使用:

curl  -XGET 'http://192.168.111.130:9200/index-instance/type-instance/_search?pretty'  -H 'Content-Type:application/json'  -d'
{
"from": 0, "size": 5,
"query": {
     "term": { "type": "department"}
 }
}
'

如果需要知道查询总数,则使用_count代替_search:

curl  -XGET 'http://192.168.111.130:9200/index-instance/type-instance/_count?pretty'  -H 'Content-Type:application/json'  -d'
{
"query": {
     "term": { "type": "department"}
 }
}
'

返回结果:

{
  "count" : 2,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  }
}

如果要联合条件查询, 则可以使用must 关键字:

curl  -XGET 'http://192.168.111.130:9200/index-instance/type-instance/_count?pretty'  -H 'Content-Type:application/json'  -d'
{
"query": {  
    "bool":{  
        "must": { "match": {" message": "酒店"}},  
        "must": {"term":  { "type": "IT" } }  
   }    
 }
}
'

由于这是一篇科普类文章,所以简单地介绍了一下ES的用法,更多高级用法可参考ES官网。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…
暂无图片
编程学习 ·

2022-2028年中国在线旅行预订市场投资分析及前景预测报告

【报告类型】产业研究 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了在线旅行行业相关概述、中国在线旅行行业运行环境、分析了中国在线旅行行业的现状、中国在线旅行行业竞争格局、对中…