ElasticSearch学习– 索引操作和查询操作

ElasticSearch学习– 索引操作和查询操作elasticsearc 查询相关 must must not filter should term terms bool 组合查询 索引创建等 elasticsearc 查询索引

大家好,欢迎来到IT知识分享网。

目录

一. 索引

二. 查询

1. 上下文

2. 相关度评分

3. 元数据

4. 查询全部

5. 禁用score

6. 指定source

7. 带参查询

三、macth查询 (搜索词会被分词)

1. macth

2. multi_match (用于多字段匹配)

3. match_phrase(用于短语匹配)

四、精确查询(搜索词不会被分词)

1. term

2. terms

3. range

五、过滤器 filter

六、 bool

1. must

2. filter

3. must_not

4. should


虽然工作中一直有用到es,但是每次都没有深入了解,都是浅浅的用一下,就导致出了问题后,很难发现,很难解决。比如,前几天就因为用错了term和terms看了老半天都看不出原因。所以,我痛定思痛,又开始学习es了(也是一些浅浅的学习)


一. 索引

ElasticSearch学习-- 索引操作和查询操作

?pretty是为了让输出格式更好看一点

?v:输出字段的title

简单创建索引

DELETE /user PUT /user POST user/_doc/1 { "name":"zhang san", "sex":"male", "age":18, "birth":"2000-12-12", "hobby":["read","song","movie"], "desc":"happy boy" } 

ElasticSearch学习-- 索引操作和查询操作

这样,添加一条数据后,就会创建一个索引结构:

ElasticSearch学习-- 索引操作和查询操作

其中,字符串会默认创建text类型字段,数字会默认创建long类型字段,日期格式会创建date类型字段

text类型的字段,会自动创建keyword字段。keyword不进行分词,用于精准匹配;text类型的字段会被分词

比如,desc字段会被分词,而desc.keyword字段不会进行分词

ElasticSearch学习-- 索引操作和查询操作


二. 查询

我感觉查询就是很复杂,之前写的dsl都是按照别人写的,照葫芦画瓢,写个差不多,然后发现能用,就不再管了, 还是要好好学习呀

1. 上下文

GET    user/_search

ElasticSearch学习-- 索引操作和查询操作

ElasticSearch学习-- 索引操作和查询操作

查询结果如下:

2. 相关度评分

查询结果的排序默认按照相关度评分排序,评分越高,排名越靠前

3. 元数据

_source中的值就是元数据

4. 查询全部

这两个都是查询全部

其中  GET    user/_search 相当于 select * from user

相当于 select * from user where 1=1;

GET user/_search GET user/_search { "query":{ "match_all":{} } }


5. 禁用score

不展示元数据,只展示id,节省存储开销

GET user/_search { "_source": false, "query":{ "match_all":{} } }

 结果如下:ElasticSearch学习-- 索引操作和查询操作

禁用source的优缺点:

ElasticSearch学习-- 索引操作和查询操作  

 也可以在创建索引时,就设置查询时包含哪些字段,不包含哪些字段

PUT user2 { "mappings":{ "_source":{ "includes":[], // 查询时包含哪些字段 "excludes":[] // 查询时不包含哪些字段 } } }


6. 指定source

可以通过指定source来返回字段,相当于select name from user where 1=1

GET user/_search { "_source": "name", "query":{ "match_all":{} } } 

ElasticSearch学习-- 索引操作和查询操作

 source支持数组,也支持通配符 filed1.*    [“”,””],

也可以通过includes和exclueds来指定结果包含哪些字段,不包含哪些字段

GET user/_search { "_source": { "includes":[], "exclueds":[] } "query":{ "match_all":{} } }

includes和exclueds冲突,以exclueds为准


7. 带参查询


三、macth查询 (搜索词会被分词)

1. macth

match是包含的意思,分词查询

GET user/_search { "query":{ "match":{ "name":"xiao" } } }

查询name中包含xiao的,其中xiao ming的xiao mei都包含,因为name的text类型的字段,会对name中的空格进行分词,比如xiao ming,会被分词为xiao 和ming,其中xiao就符合name:xiao,所以就能查到这条数据

ElasticSearch学习-- 索引操作和查询操作

简单演示一下分词(因为英文的分词基本都是以空格进行分词,这里图省事都没有用中文)

GET user/_analyze { "analyzer": "standard", "text": "xiao ming" }

ElasticSearch学习-- 索引操作和查询操作


2. multi_match (用于多字段匹配)

GET user/_search { "query":{ "multi_match":{ "query":"li si", "fields":["name","desc"] } } } 

 查询name或者desc字段中包含li或者si的结果

ElasticSearch学习-- 索引操作和查询操作


3. match_phrase(用于短语匹配)

短语中的词不会被分词

查询包含aa和bb的,并且顺序不能乱(aa bb是一体的)

GET user/_search { "query":{ "match_phrase":{ "desc":"li si" } } }

ElasticSearch学习-- 索引操作和查询操作


四、精确查询(搜索词不会被分词)

1. term

精准匹配, 匹配和搜索词项完全相等的结果,不进行分词

ElasticSearch学习-- 索引操作和查询操作

ElasticSearch学习-- 索引操作和查询操作

这样没有结果,是因为 desc中的li si会被分词为li 和si,term不进行分词,所以需要查询完整的li si,所以查不到结果, 下面的name.keyword不会进行分词,所以就能查到了

ElasticSearch学习-- 索引操作和查询操作


2. terms

terms用法与term基本相同, 区别在于terms查询可以用于数组

GET user/_search { "query":{ "terms":{ "hobby":["running","song"] } } }

ElasticSearch学习-- 索引操作和查询操作


3. range

范围查询

GET user/_search { "query":{ "range":{ "age":{ "gte":18, "lte":20 } } } }

查询age>=18 and age <=20的结果 

ElasticSearch学习-- 索引操作和查询操作

 也可以用于日期

ElasticSearch学习-- 索引操作和查询操作

 其中,


五、过滤器 filter

filter是以结果为导向, query是以过程为导向
query进行相关度评分, filter不进行相关度评分,每一条数据得分都是1.0 
filter有缓存机制, 性能比query

ElasticSearch学习-- 索引操作和查询操作

filter嵌套在constant_score中,默认评分是1.0,也可以指定评分

GET user/_search { "query":{ "constant_score":{ "filter":{ "match":{ "name":"li si" } } } } } 

ElasticSearch学习-- 索引操作和查询操作

 指定评分,所有评分都是1.2

ElasticSearch学习-- 索引操作和查询操作

constant_scorehe bool都能嵌套filter,bool下面说


六、 bool

bool用于组合查询,可以将must、filter、should、must_not进行组合查询,must和should会参与计算相关度评分,filter和must_not不计算相关度评分

must:必须全部满足,相当于and

ElasticSearch学习-- 索引操作和查询操作

1. must

匹配name包含li si的,并且desc包含boy的

GET user/_search { "query":{ "bool":{ "must":[ { "match":{ "name":"li si" } }, { "match":{ "desc":"boy" } } ] } } }

ElasticSearch学习-- 索引操作和查询操作


2. filter

同must,只是没有相关度评分(为0)

GET user/_search { "query":{ "bool":{ "filter":[ { "match":{ "name":"li si" } }, { "match":{ "desc":"boy" } } ] } } }

ElasticSearch学习-- 索引操作和查询操作


3. must_not

匹配都不包含的结果,name不包含li si,desc不包含boy,也不进行相关度评分 

GET user/_search { "query":{ "bool":{ "must_not":[ { "match":{ "name":"li si" } }, { "match":{ "desc":"boy" } } ] } } }

ElasticSearch学习-- 索引操作和查询操作


4. should

should相当于or,其中满足一条就能查询出来,会进行相关度评分 

GET user/_search { "query":{ "bool":{ "should":[ { "match":{ "name":"li si" } }, { "match":{ "desc":"boy" } } ] } } }

ElasticSearch学习-- 索引操作和查询操作

当查询中包含filter或者must,should中满足条件的个数可以为0

可以通过设置minimum_should_match来控制should中的条件至少应该满足几个

ElasticSearch学习-- 索引操作和查询操作

当没有设置 minimum_should_match时,第二条数据没有满足should中的条件 

ElasticSearch学习-- 索引操作和查询操作

设置了minimum_should_match=1后,要求should中至少要有一条满足条件,所以只有一条结果了

* 复杂的是,每个查询中都可以再嵌套bool

GET user/_search { "query":{ "bool":{ "filter":[ { "match":{ "name":"li" } }, { "match":{ "hobby":"song" } } ], "should":[ { "match":{ "age":"17" } }, { "bool":{ "must":[ { "match":{ "sex":"male" } } ] } } ], "minimum_should_match":1 } } }

这样,should中的两个条件满足一个就可以了,所以结果又多了一条 

ElasticSearch学习-- 索引操作和查询操作

最后:查询所有索引可以用 GET _search

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117228.html

(0)
上一篇 2025-11-22 18:33
下一篇 2025-11-22 19:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信