ElasticSearch

一、ES简介

  • 第一个公开版本出现在2010年2月
  • ES是基于Apache Lucene构建的开源搜索引擎
Lucene本身就可以被认为迄今为止性能最好的一款开源搜索引擎工具包,但是lucene的API相对复
杂,需要深厚的搜索理论.

ES是采用java语言编写,提供了简单易用的RestFul API,开发者可以使用其简单的RestFul API,
开发相关的搜索功能,从而避免lucene的复杂性.

二、RestFul

  • REST:表现层状态转化(Representational State Transfer)
  • 如果一个架构符合REST原则,就称它为 RESTful 架构风格。
资源:    网络上的一个实体,或者说是网络上的一个具体信息
表现层 : "资源"具体呈现出来的形式,叫做它的"表现层"(Representation)
表现层状态转化:
    如果客户端想要操作服务器,必须通过某种手段,让服务器端
    发生"状态转化"(State Transfer)。而这种转化是建立在表现
    层之上的,所以就是"表现层状态转化"

REST原则就是指一个URL代表一个唯一资源,并且通过HTTP协议里面四个动词:
	GET、POST、PUT、DELETE对应四种服务器端的基本操作:
 		 GET用来获取资源,
		 POST用来添加资源(也可以用于更新资源),
		 PUT用来更新资源,
		 DELETE用来删除资源

三、全文检索(Full-Text Retrieval)

  • 全文检索-----以文本作为检索对象,找出含有指定词汇的文本.
  • 全面、准确和快速是衡量全文检索系统的关键指标
计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的
次数和位置。
当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。
  • 特点
	1. 只处理文本。不处理语义。
	3. 搜索时英文不区分大小写。
	4. 结果列表有相关度排序。

四、ES的安装

4.1 准备服务器

要求:
    centos7 +
	java 8  +
	elastic 6.2.4+
		[root@localhost ~]# java -version
		java version "1.8.0_171"
		Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
		Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
		
改ip(克隆虚拟服务器):vim 
	 [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
					IPADDR=192.168.134.40
改ip重启network服务:
     [root@localhost ~]# systemctl restart network
  

4.2 安装步骤

  • elasticsearch-6.2.4.tar.gz
[root@localhost ~] tar -zxvf  elasticsearch-6.2.4.tar.gz

root 不能启动,需新建用户:
   1.在linux系统中创建新的组            groupadd es
   2.创建新的用户es并将es用户放入es组中  useradd es -g es 
   3.修改es用户密码                     passwd es (123456)
   4.将root用户解压的文件移动到es用户目录中
		mv /root/elasticsearch-6.2.4  /home/es/
   5.改变文件的所有者(root操作)
		chown -R es:es 当前es的安装目录(这里是:/home/es/elasticsearch)
	   [root@localhost ~] chown -R es:es /home/es/elasticsearch/
 
  6: ES用户开启ES远程访问(不开:浏览器不能访问)
		vim elasticsearch.yml 将原来network修改为以下配置:
		network.host: 0.0.0.0
  7Root用户 修改系统环境变量
     重新启动es出现如下错误
	 ERROR: bootstrap checks failed[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]**
		vim /etc/security/limits.conf
		 # 在最后面追加下面内容
        *               soft    nofile          65536
        *               hard    nofile          65536
        *               soft    nproc           4096
        *               hard    nproc           4096
    修改后退出 root ES用户重新进入系统。
     # 退出重新登录检测配置是否生效:ES用户执行
        ulimit -Hn
        ulimit -Sn
        ulimit -Hu
        ulimit -Su
  8、重新启动出现如下错误
	  **ERROR: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]**
       解决方案:
        vim /etc/sysctl.conf
        vm.max_map_count=655360 (文件最下面插入,虚拟机参数)
       #执行以下命令生效:(验证是否修改成功)如后截图
        sysctl -p 
 9、关闭网络防火墙
		systemctl stop firewalld
		systemctl disable firewalld
  10. 登录es用户启动ES(普通用户)
	[/bin]	./elasticsearch   启动ES
	 //后台启动 
	 ./elasticsearch -d
  11. 外部浏览器访问即可
    在命令终端中执行: curl http://localhost:9200
	http://192.168.134.40:9200 出现如下信息说明安装成功:
	{
        "name" : "xQK1cwT",
        "cluster_name" : "elasticsearch",
        "cluster_uuid" : "t7IYk7LKQ0mXcyyrdFWpLg",
        "version" : {
        "number" : "6.2.4",
        "build_hash" : "ccec39f",
        "build_date" : "2018-04-12T20:37:28.497551Z",
        "build_snapshot" : false,
        "lucene_version" : "7.2.1",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
        },
        "tagline" : "You Know, for Search"
   	}
   	
   	启动kibana(先起ES,在启动kibana)
	systemctl start kibana
	systemctl stop  kibana
	systemctl status kibana
	//访问: http://192.168.134.40:5601/
	

在这里插入图片描述
在这里插入图片描述

  • 检测是是否安装成功 9200 ES默认访问端口
    在这里插入图片描述
  • 开启远程访问
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

五、ES相关概念

在这里插入图片描述

5.1 索引(index)

一个索引就是一个拥有几分相似特征文档的集合。
	如:客户数据的索引
		产品目录的索引
		订单数据的索引 等
索引类似于关系型数据库中Database 的概念。
    如:
     /cms(全小写:存拥有几分相似特征文档的集合) (index) 			
一个索引由一个名字来标识(必须全部是小写字母的)

5.2 类型(type)

在一个索引中,你可以定义一种或多种类型.
   类型是索引一个逻辑上的分类/分区,
   通常,会为具有一组共同字段的文档定义一个类型
   如:  
	运营一个博客平台并且将你所有的数 据存储到一个索引中。
		可以为用户数据定义一个类型。
		为博客数据定义另一个类型。
		也可 以为评论数据定义另一个类型。
		类型类似于关系型数据库中Table的概念
		
  类型类似与数据库中的表。  
	     user_info
	     business_type
	     business_apply
	     business_approve
	     business_contract
	     business_putout
	     business_duebill 等
5.x版本以前可以在一个索引中定义多个类型,
	6.x之后版本也可以使用,但是不推荐.
	8.x版本中彻底移除一个索引中创建多个类型

5.3 文档(document)

一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。
	如:你可以拥有某一个员工的文档,
	    也可以拥有某个商品的一个文档。
文档采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。

5.4 映射(Mapping类似于数据库表结构)

	定义一个索引(index)中的类型(type)的数据的结构(类十于表的结构描述)。
	

六、可视化工具Kibana的安装

Kibana是一个针对Elasticsearch的开源分析及可视化平台。
使用Kibana可以查询、查看并与存储在ES索引的数据进行交互操作。
使用Kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据

1. 下载Kibana
	https://www.elastic.co/downloads/kibana

2. 安装下载的kibana (root用户执行)
	rpm -ivh kibana-6.2.4-x86_64.rpm

3. 查找kibana的安装位置
	find / -name kibana
    
4. 编辑kibana配置文件
	[root@localhost /]# vim /etc/kibana/kibana.yml

5. 修改如下配置
	server.host: "10.102.115.3"                		#ES服务器主机名
	elasticsearch.url: "http://10.102.115.3:9200"   #ES服务器地址

6. 启动kibana(先起ES,在启动kibana)
	systemctl start kibana
	systemctl stop  kibana
	systemctl status kibana

7. 访问kibana的web界面  
	http://10.102.115.3:5601/   #kibana默认端口为5601 使用主机:端口直接访问即可  

在这里插入图片描述
在这里插入图片描述

  • [root@localhost /]# vim /etc/kibana/kibana.yml
    在这里插入图片描述
    在这里插入图片描述
  • 基本使用
    在这里插入图片描述

七、Kibana的使用

7.1 索引(Index)的基本操作

	PUT /dangdang/       	  	创建索引
	DELETE /dangdang			删除索引
	DELETE /*					删除所有索引
	GET /_cat/indices?v 		查看索引信息

get /ems/_mapping   // GET /ems/_mapping/emp
			{
			  "ems": {
			    "mappings": {
			      "emp": {
			        "properties": {
			          "age": {
			            "type": "integer"
			          },
			          "content": {
			            "type": "text",
			            "analyzer": "ik_max_word"
			          },
			          "name": {
			            "type": "text",
			            "analyzer": "ik_max_word"
			          },
			          "sex": {
			            "type": "keyword"
			          }
			        }
			      }
			    }
			  }
			}

7.2 类型(type)的基本操作

1.创建/dangdang索引并创建(product)类型
PUT /dangdang             
{
  "mappings": {
    "product": {
      "properties": {
        	"title":    { "type": "text"  },
        	"name":     { "type": "text"  },
       		"age":      { "type": "integer" },
        	"created":  {
         		 "type":   "date",
          		 "format": "YYYY-MM-dd"
        		}
      		}
    	}
  	}
}

Mapping Type: 
   text , keyword (类似String, date ,integer, long , double , boolean or ip 
查看类型:
 	索引/_映射/类型
	GET /dangdang/_mapping/product # 语法:GET /索引名/_mapping/类型名

7.3 文档(document)的基本操作

7.3.1 添加文档

#/索引/类型/id  //自动的创建映射
PUT /ems/emp/1   
{
  "name":"赵小六",
  "age":23,
  "bir":"2012-12-12",
  "content":"这是一个好一点的员工"
}

7.3.2 查询文档

GET /ems/emp/1  
返回结果:
{
  "_index": "ems",
  "_type": "emp",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "name": "赵小六",
    "age": 23,
    "bir": "2012-12-12",
    "content": "这是一个好一点的员工"
  }
}

7.3.3 删除文档

DELETE /ems/emp/1
{
  "_index": "ems",
  "_type": "emp",
  "_id": "1",
  "_version": 2,
  "result": "deleted", #删除成功
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

7.3.4 更新文档

1.第一种方式  更新原有的数据
    POST /ems/emp/1/_update
    {
      "doc":{
        "name":"xiaohei"
      }
    }
2.第二种方式  添加新的数据
    POST /ems/emp/1/_update
    {
      "doc":{
        "name":"xiaohei",
        "age":11,
        "dpet":"你好部门"
      }
    }
    //没有的字段会系自动添加到映射里。
3.第三种方式 在原来数据基础上更新 tx. 上下文
	POST /ems/emp/1/_update
    {
      "script": "ctx._source.age += 5"
    }

7.3.5 批量操作

1. 批量索引两个文档 
    PUT /dangdang/emp/_bulk
 	{"index":{"_id":"1"}} 
  		{"name": "John Doe","age":23,"bir":"2012-12-12"}
	{"index":{"_id":"2"}}  
  		{"name": "Jane Doe","age":23,"bir":"2012-12-12"}
    
2. 更新文档同时删除文档(别换行)
    POST /dangdang/emp/_bulk
		{"update":{"_id":"1"}}
			{"doc":{"name":"lisi"}}
		{"delete":{"_id":2}}
		{"index":{}}
			{"name":"xxx","age":23}
 
注意:批量时不会因为一个失败而全部失败,而是继续执行后续操作,批量在返回时按照执行的
	 状态开始返回

八 ES中高级检索

8.1 检索方式分类

一种是通过 DSL(Domain Specified Language) 进行搜索。
一种是通过 URL 参数进行搜索。

官方更推荐使用第一种方式,第一种方式是基于传递JSON作为请求体(request body)格式与
	ES进行交互,这种方式更强大,更简洁
	
//URL 基本语法	
GET /ems/emp/_search?q=*&sort=age:asc
    _search 搜索的API
    q=*     匹配所有文档
    sort    以结果中的指定字段排序

8.2 DSL(Domain Specified Language) 基本使用

8.2.1 新建:索引_映射_类型

1.删除索引
	DELETE /ems
2.创建索引并指定类型
	PUT /ems
	{
	  "mappings":{
	    "emp":{
	      "properties":{
	        "name":{
	          "type":"text"
	        },
	        "age":{
	          "type":"integer"
	        },
	        "bir":{
	          "type":"date"
	        },
	        "content":{
	          "type":"text"
	        },
	        "address":{
	          "type":"keyword"
	        }
	      }
	    }
	  }
	}

8.2.2 PUT 导入测试数据

PUT /ems/emp/_bulk
  {"index":{}}
  {"name":"老王","age":23,"bir":"2012-12-12","content":"为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
  {"index":{}}
  {"name":"王二","age":24,"bir":"2012-12-12","content":"Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式","address":"上海"}
  {"index":{}}
  {"name":"张飞","age":8,"bir":"2012-12-12","content":"Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来越完善","address":"无锡"}
  {"index":{}}
  {"name":"刘肥","age":9,"bir":"2012-12-12","content":"Spring的目标是致力于全方位的简化Java开发。 这势必引出更多的解释, Spring是如何简化Java开发的?","address":"南京"}
  {"index":{}}
  {"name":"张三","age":43,"bir":"2012-12-12","content":"Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API","address":"杭州"}
  {"index":{}}
  {"name":"李四","age":59,"bir":"2012-12-12","content":"ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口","address":"北京"}
  

8.2.3 查询所有 (match_all)

GET /ems/emp/_search
{
    "query": {"match_all": {}},
    "sort": [
        {
            "age": {
                "order": "desc"
            }
        }
    ]
}

//url 方式
GET /ems/emp/_search?q=*&sort=age:asc

8.2.4 查询结果中返回指定条数(size)

	//总共查询数据 6条,只返回一条。
	GET /ems/emp/_search
	{
	 	"query": { "match_all": {} },
		"size": 1
	}	

8.2.5 分页查询(from)

	GET /ems/emp/_search
	{
	      "query": {"match_all": {}},
	      "sort": [
	        {
	          "age": {
	            "order": "desc"
	          }
	        }
	      ],
	      "size": 2, 
	      "from": 1
	}

编号:先为每一条文档编号。顺序 0,12,34 
     每页显示 2条,从不编号为1 开始。
     总共6条数据,from 设置为6时,击中不了数据。
     

8.2.6 查询结果中返回指定字段(_source)

	GET /ems/emp/_search
	{
	      "query": { "match_all": {} },
	      "_source": ["name", "age"],
	      "size": 1
	}

在这里插入图片描述

8.2.6 关键词查询(term)

  • 字段包含北京
	GET /ems/emp/_search
	{
	  "query": {
	    "term": {
	      "address": {
	        "value": "北京"
	      }
	    }
	  }
	}
//  ES中默认使用分词器为标准分词器(StandardAnalyzer).
    //标准分词器对于英文单词分词,对于中文单字分词.
    //只对映射类型为text的才会分词。(即搜索词组,则匹配不到相应的文档)。

//在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这
	//些类型不分词,只有text类型分词.

8.2.7 范围查询(range)

  • 用来指定查询指定范围内的文档
	GET /ems/emp/_search
	{
	  "query": {
	    "range": {
	      "age": {
	        "gte": 8,
	        "lte": 30
	      }
	    }
	  }
	}

8.2.8 前缀查询(prefix)

  • 用来检索含有指定前缀的关键词的相关文档
	GET /ems/emp/_search
	{
	  "query": {
	    "prefix": {
	      "content": {
	        "value": "redis"
	      }
	    }
	  }
	}

8.2.8 通配符查询(wildcard)

  • ? 用来匹配一个任意字符 * 用来匹配多个任意字符
//注意:Re* 大写匹配不出来
GET /ems/emp/_search
{
  "query": {
    "wildcard": {
      "content": {
        "value": "re*"
      }
    }
  }
}

//注意:Re?is 大写匹配不出来
GET /ems/emp/_search
{
  "query": {
    "wildcard": {
      "content": {
        "value": "re?is"
      }
    }
  }
}

8.2.9 多id查询(ids)

  • 值为数组类型,用来根据一组id获取多个对应的文档
	GET  /ems/emp/_search
	{
	  "query": {
	    "ids": {
	      "values": ["2FuRrnkBoPZ0nTP6oxaP","2luRrnkBoPZ0nTP6oxaP"]
	    }
	  }
	}

8.2.10 模糊查询(fuzzy)

  • 用来模糊查询含有指定关键字的文档
	GET /ems/emp/_search
		{
		  "query": {
		    "fuzzy": {
		      "content":"用"
		    }
		  }
		}

8.2.11 布尔查询(bool)

  • 用来组合多个条件实现复杂查询
	must: 相当于&& 同时成立
	should: 相当于|| 成立一个就行
	must_not: 相当于!  不能满足任何一个
    优先匹配 must,must_not,(在有sould的情况下)
	GET /ems/emp/_search
	{
	  "query": {
	    "bool": {
	      "must": [
	        {
	          "range": {
	            "age": {
	              "gte": 0,
	              "lte": 44
	            }
	          }
	        }
	      ],
	      "must_not": [
	        {"wildcard": {
	          "name": {
	            "value": "2"
	          }
	        }}
	      ]
	    }
	  },
	  "sort": [
	    {
	      "age": {
	        "order": "desc"
	      }
	    }
	  ]
	}

8.2.12 高亮查询(highlight)

  • 可以让符合条件的文档中的关键词高亮
  • 默认加 倾斜标签
	GET /ems/emp/_search
	{
	  "query": {
	    "term": {
	      "content": {
	        "value": "redis"
	      }
	    }
	  },
	  "highlight": {
	    "fields": {
	      "*": {}
	    }
	  }
	}
  • 自定义高亮html标签: 可以在highlight中使用pre_tags和post_tags
	GET /ems/emp/_search
	{
	  "query":{
	    "term":{
	      "content":"框"
	    }
	  },
	  "highlight": {
	    "pre_tags": ["<span style='color:red'>"],
	    "post_tags": ["</span>"],
	    "fields": {
	      "*":{}
	    }
	  }
	}

  • 多字段高亮 使用require_field_match开启多个字段高亮
  • 及搜索的字段为context,但是name中野存在该字段,设置false ,则name中的 检索字段也会高亮
	 GET /ems/emp/_search
	{
	  "query":{
	    "term":{
	      "content":"框"
	    }
	  },
	  "highlight": {
	    "pre_tags": ["<span style='color:red'>"],
	    "post_tags": ["</span>"],
	    "require_field_match":false,
	    "fields": {
	      "*":{}
	    }
	  }
	}

8.2.13 多字段查询(query_String)

  • 指定的映射字段包含 检索的字段,则会检索到。如:name或content 包含‘中’ 或国的都会检索出来
	GET /ems/emp/_search
	{
	  "query": {
	    "query_string": {
	      "query": "中国",
	      "fields": ["name","content"]
	    }
	  }
	}

8.2.14 多字段分词查询(query_String)

  • 适应规则,先将检索的词进行 分词(默认单字分词),在在检索的各字段中去进行检索
	GET /dangdang/book/_search
	{
	  "query": {
	    "query_string": {
	      "query": "中国声音",
	      "analyzer": "ik_max_word", 
	      "fields": ["name","content"]
	    }
	  }
	}

九 、IK分词器的安装与使用

  • 默认ES中采用标准分词器进行分词(单字分词),不适用于中文网站,因此需要修改ES对中文友好分词,从而达到更加的搜索的效果。
  • IK分词器提供了两种mapping类型用来做文档的分词分别是 ik_max_word 和ik_smart
 ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”
   拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,,,共和国,共和,,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”

9.1 、IK的安装

9.1.1 在线安装IK

  • 在线安装IK (v5.5.1版本后开始支持在线安装 )
1. 在es安装目录中执行如下命令

[es@linux elasticsearch-6.2.4]$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip
[=================================================] 100%
-> Installed analysis-ik
[es@linux elasticsearch-6.2.4]$ ls plugins/
analysis-ik
[es@linux elasticsearch-6.2.4]$ cd plugins/analysis-ik/
[es@linux analysis-ik]$ ls
commons-codec-1.9.jar    elasticsearch-analysis-ik-6.2.4.jar  httpcore-4.4.4.jar
commons-logging-1.2.jar  httpclient-4.5.2.jar                 plugin-descriptor.properties


2. 重启es生效
//要求版本严格与当前使用版本一致,如需使用其他版本替换 6.2.4 为使用的版本号

9.1.2 本地安装IK

1. 下载对应版本
	[es@linux ~]$ wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip

2. 解压
	[es@linux ~]$ unzip elasticsearch-analysis-ik-6.2.4.zip #先使用yum install -y unzip

3. 移动到es安装目录的plugins目录中
	[es@linux ~]$ ls elasticsearch-6.2.4/plugins/
	[es@linux ~]$ mv elasticsearch elasticsearch-6.2.4/plugins/
	[es@linux ~]$ ls elasticsearch-6.2.4/plugins/
		elasticsearch
	[es@linux ~]$ ls elasticsearch-6.2.4/plugins/elasticsearch/
		commons-codec-1.9.jar    config                               httpclient-4.5.2.jar  		plugin-descriptor.properties
		commons-logging-1.2.jar  elasticsearch-analysis-ik-6.2.4.jar  httpcore-4.4.4.jar
		
4. 重启es生效

9.2 、IK分词器的测试

  • 建立索引_映射_类型 (类型为text)
  • 需指明建立使用的分词器,索引使的分词器(须一致)

DELETE /ems

PUT /ems
{
  "mappings":{
    "emp":{
      "properties":{
        "name":{
          "type":"text",
           "analyzer": "ik_max_word",
           "search_analyzer": "ik_max_word"
        },
        "age":{
          "type":"integer"
        },
        "bir":{
          "type":"date"
        },
        "content":{
          "type":"text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        },
        "address":{
          "type":"keyword"
        }
      }
    }
  }
}
  • 导入测试数据
PUT /ems/emp/_bulk
  {"index":{}}
  {"name":"小黑","age":23,"bir":"2012-12-12","content":"为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
  {"index":{}}
  {"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式","address":"上海"}
  {"index":{}}
  {"name":"张小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来越完善","address":"无锡"}
  {"index":{}}
  {"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目标是致力于全方位的简化Java开发。 这势必引出更多的解释, Spring是如何简化Java开发的?","address":"南京"}
  {"index":{}}
  {"name":"梅超风","age":43,"bir":"2012-12-12","content":"Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API","address":"杭州"}
  {"index":{}}
  {"name":"张无忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口","address":"北京"}

  • 执行检索
	GET /ems/emp/_search
	{
	  "query":{
	    "term":{
	      "content":"框架"
	    }
	  },
	  "highlight": {
	    "pre_tags": ["<span style='color:red'>"],
	    "post_tags": ["</span>"],
	    "fields": {
	      "*":{}
	    }
	  }
	}
  • 多字段检索 可对长的一句话进行分词检索,查询可用性比term关键字强。
  • 如:检索 ‘‘我想拥有丰富的开发经验’ 检索 term检索不到,但多字段检索,可以匹配到响应的文档。
	GET /ems/emp/_search
	{
	  "query": {
	    "query_string": {
	      "query": "有快速开发",
	      "fields": ["name","content"]
	    }
	  }
	}

9.3、IK支持自定义扩展词典和停用词典

  • IK支持自定义扩展词典和停用词典
扩展词典:
 	就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。
停用词典:
    有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。
    
  • 如何定义扩展词典和停用词典可以修改IK分词器中config目录中IKAnalyzer.cfg.xml这个文件。
  • 相关的配置
1. 修改vim IKAnalyzer.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">ext_dict.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">ext_stopword.dic</entry>
    </properties>

2. 在ik分词器目录下config目录中创建ext_dict.dic文件   编码一定要为UTF-8才能生效
	vim ext_dict.dic 加入扩展词即可

3. 在ik分词器目录下config目录中创建ext_stopword.dic文件 
	vim ext_stopword.dic 加入停用词即可

4.重启es生效

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十、过滤查询 (Filter Query)

10.1 过滤查询

  • ES中的查询操作分为2种:查询(query )和过滤(filter).
查询:(查询)默认会计算每个返回文档的得分,然后根据得分排序.
过滤: 只会筛选出符合的文档,并不计算得分,且它可以缓存文档 。
	 所以,单从性能考虑,过滤比查询更快.
	 
	过滤适合在大范围筛选数据,而查询则适合精确匹配数据。
	一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据.

10.2 过滤语法

  • Elasticsearch会自动缓存经常使用的过滤器,以加快性能
	GET /ems/emp/_search
	{
	  "query": {
	    "bool": {
	      "must": [
	        {"match_all": {}}
	      ],
	      "filter": {
	        "range": {
	          "age": {
	            "gte": 10
	          }
	        }
	      }
	    }
	  }
	}
	

10.3 常见的过滤器类型

10.3.1 term Filter / terms Filter

  • 在执行filter和query时,先执行filter在执行query。
	GET /ems/emp/_search   # 使用term过滤
	{
	  "query": {
	    "bool": {
	      "must": [
	        {"term": {
	          "name": {
	            "value": "小黑"
	          }
	        }}
	      ],
	      "filter": {
	        "term": {
	          "content":"框架"
	        }
	      }
	    }
	  }
	}
	
//terms
GET /dangdang/book/_search  #使用terms过滤
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "name": {
            "value": "中国"
          }
        }}
      ],
      "filter": {
        "terms": {
          "content":[
              "科技",
              "声音"
            ]
        }
      }
    }
  }
}

10.3.2 ranage filter

	GET /ems/emp/_search
	{
	  "query": {
	    "bool": {
	      "must": [
	        {"term": {
	          "name": {
	            "value": "中国"
	          }
	        }}
	      ],
	      "filter": {
	        "range": {
	          "age": {
	            "gte": 7,
	            "lte": 20
	          }
	        }
	      }
	    }
	  }
	}

10.3.3 exists filter

  • 过滤存在指定字段,(获取当前索引含有name字段的文档 空也会被检索到)。
	GET /ems/emp/_search
	{
	  "query": {
	    "bool": {
	      "must": [
	        {"term": {
	          "name": {
	            "value": "中国"
	          }
	        }}
	      ],
	      "filter": {
	        "exists": {
	          "field":"name"
	        }
	      }
	    }
	  }
	}

10.3.4 ids filter

  • 过滤含有指定字段的索引记录
	GET /ems/emp/_search
	{
	  "query": {
	    "bool": {
	      "must": [
	        {"term": {
	          "name": {
	            "value": "中国"
	          }
	        }}
	      ],
	      "filter": {
	        "ids": {
	          "values": ["1","2","3"]
	        }
	      }
	    }
	  }
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值