五、elasticsearch查询操作
目录
3、排序查询(默认根据指定字段升序asc排序)(“sort”)
elasticsearch查询操作大致可分为以下几种(这些操作MySQL也可以做,但是在大数据量的情况下有可能会出现效率较慢的情况)而elasticsearch可以说是解决这种问题的灵丹妙药,为查询而生,特别是大数据量的模糊查询
匹配查询 match
按照条件查询 (must、must_not、should)
精确查询 (term)
区间范围查询(filer ->range)
匹配字段查询
多条件查询(布尔查询)
高亮查询 (highlight)
数据准备
使用kibana执行操作,将数据保存在elasticsearch中
PUT /book/_doc/1
{
"name":"数据结构",
"desc":"基础学习数据结构与算法",
"price":15
}
PUT /book/_doc/2
{
"name":"Java",
"desc":"这是一本java基础学习",
"price":40
}
PUT /book/_doc/3
{
"name":"Linux",
"desc":"服务器命令操作",
"price":35
}
PUT /book/_doc/4
{
"name":"c语言",
"desc":"入门教程",
"price":20
}
查看索引详细信息,es帮着我们自动推断并设置了字段类型
在使用kabina时,输入关键字kibina会有提示,点击enter即可帮助我们自动补全API命令,但是注意如果输入了”_doc”则没有了提示
1、查询指定字段包含指定内容的文档
查询文档中name包含数据的文档记录
第一种方式GET book/_doc/_search?q=name:数据
第二种方式
GET book/_doc/_search
{
"query": {
"match":{
"name": "数据"
}
}
}
2、指定输出的文档字段查询(“_source”)
查询文档中name包含数据的文档记录,并只要查出文档记录的name和desc
GET book/_doc/_search
{
"query": {
"match":{
"name": "数据"
}
},
"_source":["name","desc"]
}
3、排序查询(默认根据指定字段升序asc排序)(“sort”)
查询desc包含学习的文档并根据价格排序
GET book/_doc/_search
{
"query": {
"match":{
"desc": "学习"
}
},
"sort": [
{
"price": {
"order":"desc"
}
}
]
}
4、分页查询
查询desc包含学习的文档,只要第一页的第一条
GET book/_doc/_search
{
"query": {
"match":{
"desc": "学习"
}
},
"sort": [
{
"price": {
"order":"desc"
}
}
],
"from": 0,
"size":1
}
数据下标还是从0开始的
5、布尔查询(多条件查询)
查询文档中desc包含学习且name包含数据的记录
must(and),所有条件都要match到才可以查询出来
GET book/_doc/_search
{
"query": {
"bool":{
"must": [
{
"match": {
"desc": "学习"
}
},
{
"match": {
"name": "数据"
}
}
]
}
}
}
相当于select * from book where desc=”学习” and name=”数据”;
should(or),只要match到其中一个条件即可查询出来
GET book/_doc/_search
{
"query": {
"bool":{
"should": [
{
"match": {
"desc": "学习"
}
},
{
"match": {
"name": "数据"
}
}
]
}
}
}
must_not(or),只要match到其中一个条件,文档记录都不会查询出来
GET book/_doc/_search
{
"query": {
"bool":{
"must_not": [
{
"match": {
"desc": "学习"
}
},
{
"match": {
"name": "数据"
}
}
]
}
}
}
6、数据过滤(“filter”)
查询出desc不包含学习,name不包含数据的,价格大于等于18且小于30([18,30))的文档记录
GET book/_doc/_search
{
"query": {
"bool":{
"must_not": [
{
"match": {
"desc": "学习"
}
},
{
"match": {
"name": "数据"
}
}
],
"filter": {
"range": {
"price":{
"gte": 18,
"lt": 30
}
}
}
}
}
}
gte(greater than equal) | 大于等于 |
gt(greater than ) | 大于 |
lte(less than equal) | 小于等于 |
lt(less than ) | 小于 |
7、精确查询(term)
term查询是直接根据倒排索引指定的词条进行精确查询的
match会使用分词器解析,先分析文档,然后再通过分析的文档进行模糊查询
效率:term>match
term不会对查询条件进行分词
keyword不会对存储的数据进行分词
GET book/_doc/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"price": {
"value": 20
}
}
},
{
"term": {
"price": {
"value": 15
}
}
}
]
}
}
}
8、两个类型text和keyword
text:内容会被分词器解析
keyword: 内容不会被分词器解析,整体作为一个关键词
使用keyword作为analyzer,执行结果
text内容整体作为一个关键词解析出来,不会被分词器拆开
使用standard作为analyzer
则会使用分词器将每个文字作为一个词解析出来
创建索引测试两个类型的区别
PUT testdb
{
"mappings": {
"properties": {
"name":{
"type" :"text"
},
"desc":{
"type": "keyword"
}
}
}
}
同样把数据录入到elasticsearch中
PUT /testdb/_doc/1
{
"name":"数据结构",
"desc":"基础学习数据结构与算法",
"price":15
}
PUT /testdb/_doc/2
{
"name":"数据结构",
"desc":"基础学习数据结构与算法2",
"price":15
}
9、高亮查询(“highlight”)
GET book/_search
{
"query": {
"match": {
"name": "数据"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
默认把搜索条件匹配到的每个字加上<em>标签
10、自定义高亮标签
"pre_tags":定义标签前缀
"post_tags": 定义标签后缀
例如
GET book/_search
{
"query": {
"match": {
"name": "数据"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}