小白入口:ElasticSearch官网 ElasticSearch GitHub地址
为了方便理解es中的关系,es的index、type可以看做为mysql的database、table
在介绍语法之前大家先要搞清楚es里的分词
我们输入中文分词能搜索到汉语分词,是因为百度搜索引擎使用分词搜索和中文分词器。
QA:
什么是分词器?
es默认英文分词,如果需中文分词,安装分词器:中文分词器、IK分词器或自建词库。
什么是分词搜索?
语句:今天中午吃什么。 分词:今天、中午、吃、什么、吃什么。
通过es检索关键词来检索到排分最高词频最接近的语句。
什么是倒排索引?
正排索引 我们把索引看做是一本书的目录,通过目录找到对应页码,是key寻找value,而倒排索引是通过value寻找key,当然仅仅只是对倒排索引的一点点认识和理解,ES的存储方式是面向文档的,下面来看图:
下面我们来介绍解基本语法:
MYSQL
1.直接搜索
SELECT * FROM USER
2. 条件查询
SELECT * FROM USER WHERE NAME = '张三学'
3.多条件AND查询,OR查询
SELECT * FROM USER WHERE NAME = '张三学' AND SCORE = 70
SELECT * FROM USER WHERE GENDER = '男' OR SCORE = 70
4.使用区间查询
SELECT * FROM USER SCODE >= 10 AND SCODE <= 100
5. 使用 in查询
SELECT * FROM USER WHERE SCODE IN (60,61,62)
6.使用like查询
张后面模糊 SELECT * FROM USER WHERE NAME LIKE 张%
前后模糊 SELECT * FROM USER WHERE NAME LIKE %张%
7.分页排序
SELECT * FROM USER ORDER BY ID DESC LIMIT 0,10
ES-DSL
ElasticSearch 5.0以后,移除了string类型,string字段被拆分成两种新的数据类型: text用于全文搜索的,而keyword用于关键词搜索。
Text :分词、支持模糊、精确查询、不支持聚合
keywordText:不分词、支持模糊、精确查询、支持聚合
1.直接搜索
{"query": {"match_all": {} } }
2.条件查询
2.1.matchQuery 分词搜索
{ "query": { "match": { "name": "张三学" } }}
相关张三丰、张三、张无忌、三观、学习的都可以搜索到。
2.2.termQuery 不分词搜索
{ "query": { "term": { "name": "张三学" } }}
只能搜索到张三学,是==的关系,PS:如果name被分词了,就无法搜索到结果!
3.多条件AND查询
多条件查询时使用bool 可以用来合并多个过滤条件查询结果的布尔逻辑.
must :: 多个查询条件的完全匹配,相当于 and。
must_not :: 多个查询条件的相反匹配,相当于 not。
should :: 至少有一个查询条件匹配, 相当于 or。
must : { "query": { "bool": { "must": [ { "match": { "name": "张三学" } }, { "match": { "score": 70 } } ] } }}
filter: { "query": { "bool": { "filter": { "match": { "name": "张三学" } }, "must": [ { "term": { "score": "70" } } ] } }}
ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配,filter会自动的缓存过滤器的内容,这对于查询来说,不参与计算分值,会提高很多性能。
should:{ "query": { "bool": { "should": [ { "term": { "score": "70" } }, { "match": { "name": "张三学" } } ] } }}
4.使用区间查询
range:{ "query": { "range": { "score": { "gte": 10, "lte": 100 } } } }
5.使用in查询
terms:{ "query": { "terms": { "score": [ 60,61,62 ] } } }
6.使用like查询
前缀prefix:{ "query": { "prefix": { "name": { "value": "张" } } } }
模糊fuzzy:{ "query": { "fuzzy": { "name": { "value": "张" } } } }
7.分页排序
{ "from": 0, "size": 10, "sort": [ { "id": { "order": "desc" } } ], "query": { "match_all": {} } }
下面在是kibana上执行查询的使用