Elasticsearch总结笔记

时间:2022-01-22 00:36:37

简介

  • 底层使用的lucene引擎,lucene引擎直接使用相对复杂,有一定的学习成本,同样是使用Java编写,Elasticsearch使用的rest风格的进行交互,而数据呢则是以JSON的方式进行传输。
  • 学习Elasticsearch要求使用的JDK版本在8以上。Elasticsearch主要用于检索,尤其是其全文检索的能力,以及自带乐观锁以及友好的集群,让它越来越受欢迎。
  • 使用Elasticsearch首先要指定是如何定位数据。即三要素进行定位,index索引,type类型,id主键(_index,_type,_id
  • PUT,DELETE,POST,GET(使用的方法都是大写,大括号在请求下一行)4种REST请求方式即完成增删改查,当然在ES中改其实是先把旧的移除,重新创建一个新的文档,PUT也可以更新,但是是整体更新,POST则是可以内容追加,不过也是一个新的文档。
  • 1.映射(Mapping
    描述数据在每个字段内如何存储
    2.分析(Analysis
    全文是如何处理使之可以被搜索的
    3.领域特定查询语言(Query DSL
    Elasticsearch 中强大灵活的查询语言

类型

ES的基本类型有:(和关系型SQL区别不需要设置字段的长度)
字符串:text,keyword
数字类型:integer,long
浮点类型"float,double,
布尔类型:boolean,
时间类型:date

在ES中默认只有text类型可以分词,分词使用英文引擎,按照单词分词,如果是中文进行查询的话,则是将数据变成单字分词

增删改查操作

查:

GET /索引名(即数据库)/_doc/_id(记录id值)

增(覆盖式)

PUT /索引名(即数据库)/_doc/_id(记录id值)
{
	_id:''
}

改:(增量式)

POST  /索引名(即数据库)/_doc/_id(记录id值)
{
	要修改的字段
}

删除

DELETE /索引名(即数据库)/_doc/_id(记录id值)

批量操作

POST /索引名(即数据库)/_doc/_bulk
{
	批量的文档(需注意每行文档记录不能换行)
}

高级查询:(Query DSL
1.查询所有

GET /索引名(即数据库)/_search
{
		"query":{
				"match_all":{}
		}
}

2.term条件查询

GET /索引名(即数据库)/_search
{
		"query":{
				"term":{}
		}
}

3.range范围查询

GET /索引名(即数据库)/_search
{
		"query":{
				"range":{
						"字段":{
								"gt":"值",
								"lte":"值"
						}
				}
		}
}

3.前缀查询

GET /索引名(即数据库)/_search
{
		"query":{
				"prefix":{
						"字段":"值"
				}
		}
}

4.通配符查询

*是通配(可以匹配多个长度的),?是占位(匹配固定长度,如goo?,可匹配good,但不能god,匹配的字符长度是固定的)

GET /索引名/_search
{
 	"query": {
		 "wildcard": {
			 "字段": {
				 "value": "值* "
	 			}
			}
	 }
}

5.ids查询

GET /索引名/_search
{
	 "query": {
		 "ids": {
			 "values": id数组
		 }
 	}
}

6.模糊查询[fuzzy]

GET /products/_search
{
	 "query": {
		 "fuzzy": {
				 "字段":"值"
 			}
		}
}

模糊查询[fuzzy],切记使用有以下规则

fuzzy 关键字: ⽤来模糊查询含有指定关键字的⽂档
注意: fuzzy 模糊查询 最⼤模糊错误 必须在0-2之间
搜索关键词⻓度为 2 不允许存在模糊
搜索关键词⻓度为3-5 允许⼀次模糊
搜索关键词⻓度⼤于5 允许最⼤2模糊

7.布尔查询
这个其实就是基本类似于关系性SQL中的:exist,not exist 等语法

bool 关键字: ⽤来组合多个条件实现复杂查询
must: 相当于&& 同时成⽴
should: 相当于|| 成⽴⼀个就⾏
must_not: 相当于! 不能满⾜任何⼀个

GET /索引名/_search
{
	 "query": {
		 "bool": {
		        "must": [
                     			 {
                     			   "term":
                     			    {
                           					要求的条件JSON
                              		 }
                              	 }
                         ]
             }
      }
}

8.多字段查询[multi_match]
GET /索引名/_search

{
     "query": {
           "multi_match": {
                         "query": "值",
                          "fields":字段数组
           }
      }
}

注意: 字段类型分词,将查询条件分词之后进⾏查询改字段 如果该字段不分词就会
将查询条件作为整体进⾏查询

9.默认字段分词查询[query_string]

GET /索引名/_search
{
 "query": {
 "query_string": {
 "default_field": "查询字段",
 "query": "值"
 }
 }
}

注意: 查询字段分词就将查询条件分词查询,查询字段不分词将查询条件不分词查询

10.⾼亮查询[highlight]

highlight 关键字: 可以让符合条件的⽂档中的关键词⾼亮

GET /索引名/_search
{
	 "query": {
 			"term": {
				 "字段": {
 						"value": "值"
				 }
 		}
 },
 "highlight": {
		 "fields": {
			 "*":{}
		 	}
		 }
}

⾃定义⾼亮html标签: 可以在highlight中使⽤ pre_tags 和 post_tags

GET /索引名/_search
{
	 "query": {
		 "term": {
			 "字段": {
			 "value": "值"
		}
      }
    },
     "highlight": {
     "post_tags": ["</span>"],
       "pre_tags": ["<span style='color:red'>"],
      "fields": {
         "*":{}
    }
 }
}

多字段⾼亮 使⽤ require_field_match 开启多个字段⾼亮

GET /索引名/_search
{
    "query": {
		 "term": {
			 "字段": {
				 "value": "值"
			 }
		 }
	 },
 "highlight": {
    	"require_field_match": "false",
		 "post_tags": ["</span>"],
 		 "pre_tags": ["<span style='color:red'>"],
		 "fields": {
						 "*":{}
		 }
 	}
}

11.分页查询
利用from,和size,起始页同样是0开始,0即第一页

返回指定条数[size]
size 关键字: 指定查询结果中返回指定条数。 默认返回值10条
分⻚查询[form]
from 关键字: ⽤来指定起始返回位置,和size关键字连⽤可实现分⻚效

GET /索引/_search
{
 "query": {
 "match_all": {}
 },
 "size": 5,
 "from": 0
}

指定字段排序[sort]

GET /索引名/_search
{
 "query": {
 "match_all": {}
 },
 "sort": [
 {
 "字段": {
 "order": "desc"
 }
 }
 ]
}

12.返回指定字段[_source]
_source 关键字: 是⼀个数组,在数组中⽤来指定展示那些字段

GET /索引名/_search
{
 "query": {
 "match_all": {}
 },
 "_source": 要展示的指定字段数组
}

索引原理

倒排索引(Inverted Index) 也叫反向索引,有反向索引必有正向索引。
通俗地来讲, 正向索引是通过key找value,反向索引则是通过value找key。
ES底层在检索时底层使⽤的就是倒排索引。

在ES中除了text类型分词,其他类型不分词,因此根据不同字段创建索引。就将文档的内容根据text字段内容先进行一个默认分词,然后将每个分词有默认的,id映射,当我们查询的时候,ES会将我们搜索条件进行分词,再用搜索的分词条件和我们数据的分词内容进行一定的算法匹配,然后找到id,再关联回我们的文档数据,形成一个命中记录集合,并根据匹配算法的匹配程度给文档打分,并返回整一个结果集

本质是使用了空间换时间的实现,搜索来了只要拿搜索关键词和我们的分词关键词比较即可,所以会很快。

注意: Elasticsearch : Elasticsearch分别为每个字段都建⽴了⼀个倒排索引。因此查询
时查询字段的term, term,就能知道⽂档ID,就能快速找到⽂档。