ES基本查询,filter 查询,组合查询

3 篇文章 0 订阅

Elasticsearch 是功能强大的全文搜索引擎,用它的目的就是为了能快速的查询你想好要的数据
基本查询:利用Elasticsearch内置查询条件进行查询
组合查询:把多个基本查询组合在一起的复合性查询
过滤:查询的同时,通过filter条件 在不影响打分的情况下筛选出想要的数据

基本查询:
1.term,terms查询
2.from,size
3.返回版本号_version
4.match查询
5.升序降序
6.prefix前缀匹配查询
7.range 范围查询
8.wildcard 通配符查询
9.fuzzy 模糊查询
10.more_like & more_like_this_field查询
查询某一个索引的映射信息:

eg:index:library
查询方式:
GET /library/_mapping  ##会显示每个字段的类型信息

最简单的查询:

#指定index名以及type名的搜索,title 里面包含elasticsearch 关键字的文档,
GET /library/books/_search?q=title.elasticsearch
library 是索引字段值,books是type 字段值
##都不指定的搜索
GET /_search?q=title:elasticsearch
_score 是ES给搜索打的分值,分值越高越靠前,max_score是最高分。
“_shards”:{
	“total”:5,
	"successful":5,
	"failed":0
	},
total 是5个分片,successful 是从5个分片里面抽取结果组成,failed:0 是没有失败
“timed_out”false;  没有超时

1.term 查询
#term查询:查询 preview 字段里有某个关键词的文档

GET /library/books/_search
{
	"query":{
	"term":"
		“preview”:"elasticsearch"
		}
	}
}

terms 查询:查询某个字段里有多个关键词的文档
miniumum_match:最小匹配集:
设置为1.说明两个关键词里面最少有一个
设置为2. 说明文档里这2个关键词都得存在

GET /library/books/_search
{
	"query"{
	"terms"{
		"preview":["elasticsearch","book"]
		“miniumu_match”:2
		}
	}
}

2.from,size
控制查询返回的数量
#相当于mysql 里面的limit
from:从哪个结果开始返回
size:定义返回最大的结果数

GET /library/books/_search
{
	“from”:1,   ##从第二个开始
	"size":2,    ##返回2个
	"query":{
	"term":"
		“preview”:"elasticsearch"
		}
	}
}

3.返回版本号_version

GET /library/books/_search
{
	“version”:true,   #设置为true 显示版本
	"query":{
	"term":"
		“preview”:"elasticsearch"
		}
	}
}

4.match查询
match 查询可以接受文字,数字日期等数据类型
match 和term的区别是,match 查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询时不会有分析器分析的过程

GET /library/books/_search
{
	"query"{
	"match"{
		"preview":"elasticsearch"   ##字符串类型
		}
	}
}
GET /library/books/_search
{
	"query"{
	"match"{
		"price":11   #数字类型
		}
	}
}

通过match_all查询
查询指定索引下的所有文档

GET /library/books/_search
{
	"query"{
	"match_all"{
		"price":11   #数字类型
		}
	}
}

通过match_phrase查询
短语查询,slop定义的关键词之间隔多个未知的单词
查询elasticsearch,distributed 之间间隔2个单词的文档

GET /library/books/_search
{
	"query"{
	"match_phrase":{
		"preview":{
		"query":"Elasticsearch,distributed",
		"slop":2
		}
	}
}

multi_match查询
可以指定多个字段
比如 查询title 和preview 这2个字段里都包含Elasticsearch 关键词的文档

GET /library/books/_search
{
	"query"{
	"multi_match":{
		"query":"Elasticsearch",
		"fields":["title","preview"]
	}
}

指定返回的字段

GET /library/books/_search
{
	“fields”:["preview","title"]  ##这里指定要返回的字段
	"query"{
		"match":{
		"preview":"elasticeearch"
		}
	}
}

通过partial_fields 控制加载的字段

GET /library/books/_search
{
	“partial_fields”:{
	"partial":{
	"include":["preview"],
	"exclude":["title","price"]
	}
	},
	"query":{
	"match_all":{}
}
}

还能加通配符

GET /library/books/_search
{
	“partial_fields”:{
	"partial":{
	"include":["pre*"],
	"exclude":["tit*"]
	}
	},
	"query":{
	"match_all":{}
}
}

5.升序降序
通过sort把结果排序
desc 降序
asc 升序

GET /library/books/_search
{
	"query":{
	"match_all":{}
	},
	"sort":[
	{
	"price":{    ##根据这个字段
		"order":"desc"  ##asc 升序
		}
	}
	]
}

6.prefix前缀匹配查询

GET /library/books/_search
{
	"query":{
		"prefix":{
		"title":{
		"value":"r"      ##匹配title 字段 r开头的
		}
	}
}
}

7.range 范围查询
有from ,to,include_lower,include_upper, boost 这些参数
include_lower: 是否包含范围的左边界,默认是true
include_upper:是否包含范围的右边界,默认是true

GET /library/books/_search
{
	"query":{
	"range":{
	"publish_date":{       #时间字段
	"from":"2015-01-01",
	"to":"2015-06-30"
	          }
          }
    }
}
demo2:
GET /library/books/_search
{
	"query":{
	"range":{
	"price":{       #价格字段
	"from":"10",
	"to":"20",
	"include_lower":true,    ##意思是包括10
	"include_upper":false    ###不包括20
	          }
          }
    }
}

8.wildcard 通配符查询
wildcard 查询:允许你使用通配符 * 和 ? 来进行查询
*代表一个或多个字符
? 仅代表一个字符
注意:这个查询功能影响性能

GET /library/books/_search
{
	“query”:{
	"wildcard":{
	"preview":"rab*"
	}
    }
}
GET /library/books/_search
{
	“query”:{
	"wildcard":{
	"preview":"luc?ne"
		}
    }
}

9.fuzzy 模糊查询
value :查询的关键字
boost: 设置查询的权值,默认是1.0
min_similarity :设置匹配的最小相似度
默认值为0.5:对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型,取值为1d,2d,1m这样,1d就代表1天
prefix_length:指明区分词项的共同匹配长度,默认是0
max_expansions:指明查询中的词项可扩展的数据,默认可以是无限大
##这个也是很耗资源

GET  /library/books/_search
{
	"query":{
	"fuzzy":{
	"preview":"rabit"   ##preview 是要查询的字段值
	}
   }
}
demo2
GET  /library/books/_search
{
	"query":{
	"fuzzy":{
	"preview":{
		"value":"rabit" ,  ##preview 是要查询的字段值
		"min_similarity":0.5
		}
	}
   }
}

fuzzy_like_this 查询
查询得到与给定内容相似的所有文档
fileds:字段组,默认是_all
like_text: 设置关键词
ignore_tf : 设置忽略词项的频次,默认是false
max_query_terns : 指明在生成的查询中查询词项的最大数据,默认是25
min_similarity: 指明区分词项最小的相似度,默认是0.5
prefix_length: 指明区分词项共同前缀的长度,默认是0
boost:设置权值,默认是1.0
analyze:指明用于分析给定内容的分析器

GET /library/books/search
{
	"query":{
		"fuzzy_like_this":{
			"fileds":["preview"],            ###可定义多个字段
			"like_text":"open source software",
			"min_similarity":0.5,
			"prefix_length":0.2
		}
	}
}

fuzzy_like_this_field 查询
只作用在一个字段里
其它与fuzzy_like_this功能一样

GET /library/books/search
{
	"query":{
		"fuzzy_like_this_field":{
			"preview":{     #只能一个字段
			"like_text":"open source software",
			"min_similarity":0.5,
			"prefix_length":0.2
			}
		}
	}
}

more_like_this 查询
fields: 定义字段组,默认是all
like_text :定义要查询的额关键词
percent_terms_to_match :该参数指明一个文档必须匹配多大比例的词项才被视为相似。默认值是0.3,意思是30%的比例
min_term_freq: 改参数指明在生成的查询中查询词项的最大数据。默认是25
stop_words:该参数指明将被忽略的单词集合
min_doc_freq:该参数指明词项应至少在多少个文档中出现才不会被忽略。more 是5
max_doc_freq: 该参数指明出现词项的最大数目,以避免词项被忽略。默认无限大
min_word_len: 该参数指明单个当个单词的最小长度,低于该值的单词将被忽略,默认是无限大。
max_word_len: 指明单个单词的最大长度,高于该值的单词将被忽略。默认是无限大
boost_terms:该参数指明提升每个单词的权重时使用的权值。默认是1
boost:指明提升一个查询的权值。默认是1.0
analyer:指明用于分析的分析器

GET /library/books/_search
{
	"query":{
		"more_like_this":{
			"fields":["preview"],   ##指定字段
			"like_text":"apache open source",
			"min_term_freq":1,
			"min_doc_freq":1
		}
	}
}

同上面的类似,也有一个 more_like_this_field 查询
只作用在一个字段里
其它和more_like_this功能一样

GET /library/books/_search
{
	"query":{
		"more_like_this_field":{
			"preview" :{
			"like_text":"apache open source",
			"min_term_freq":1,
			"min_doc_freq":1
			}
		}
	}
}

**

filter 查询

**
1.filter 查询语句
2.cache 缓存
filter 类似于 SQL 里面的where 语句,和上面的基础查询比起来,也能实现搜索的功能,同时 filter 可以将查询缓存到内存当中,这样可以大大加大下一次的查询速度
推荐使用filter
最简单的filter查询
select document FROM products WHERE price = 20
filtered 查询价格是20的商品

GET /store/products/_search       ###store 索引名   products 商品名
{
	"query":{
	"filtered":{
		"query":{
			"match_all":{}   ##匹配所有
		}
		"filter":{
			"term":{ 
				"price":20
				}
			}
		}
	}
}

也可以指定多个值

GET /store/products/_search       ###store 索引名   products 商品名
{
	"query":{
	"filtered":{
		"query":{
			"match_all":{}   ##匹配所有
		}
		"filter":{
			"term":{ 
				"price":[10,20]   指定多个值
				###"productID":"sd24222222" 存在搜索不出来的情况,查看分析器解析的结果
				}
			}
		}
	}
}

#查看分析器解析的结果
GET /_analyze?text=SD24222222
查看分析的结果:
在这里插入图片描述
token 显示是小写,而我们搜索的是小写,那可能就查不到。
为什么会出现这种情况呢?是因为mapping 对字符串进行了分析,把大写的都变成了小写了。那如果就是想大写就能搜到呢?需要改map映射,重新建立一个映射,让productID处于not_analyzed模式
GET /store/_mapping ##查看映射
DELETE /store #删除映射,然后重新建立映射。
然后重新创建一下数据

PUT /store
{
	"mappings":{
		"products":{
			"properties":{
				"productID":{
					"type":"string",
					"index":"not_analyzed"
					}
				}
			}
		}
	}

bool 过滤查询,可以做组合过滤查询
select product FROM products where (price = 20 OR productID = “SD1002136” AND (price !=30)
查询价格等于20的或者productID为SD453523的商品,排除价格30元的
类似的,Elasticsearch 也有 and,or ,not 这样的组合条件的查询方式
格式如下:

{
	"bool":{
	"must":  [],
	"should":[],
	"must_not":[],
	}
}

must:条件必须满足,相当于 and
should 条件可以满足也可以不满足,相当于 or
must_not :条件不需要满足,相当于 not

GET /store/products/_search
{
	"query":{
		"fltered":{
		"filter" :{
		"bool":{
		"should":[
		{"term":{"price":20}},
		{"term":{"productID":"SD1002136"}}
		],   ###或运算,满足其中一个
		"must_not":{
		"term":{"price":30}
	          	}
		    }
		}
	  }
	}
}

嵌套查询
SELECT document FROM products WHERE productID = “SD1002136” OR (productID = “sd4535233” AND price = 30)

GET /store/products/_search
{
	"query":{
		"fltered":{
		"filter" :{
		"bool":{
		"should":[      
			{"term":{"productID":"sd1002136"}},
			{"bool":{
			"must":[
				"term":{"productID":"SD1002136"}},
				"term":{"price":30}}
				] 
		    }
		}
	  }
	}
}

另外一种 and,or,not查询
就是说没有bool,直接使用and,or,not
查询价格即是10元,productID又为SD1002136的结果

GET   /store/products/_search
{
	"query":{
		"filtered":{
		"filter":{
			"and":[
			{
			"term":{
				"price":10
				}
			},
			{
			"term":{
				"productID":"sd1002136"
				}
			}
		]
		},
		"query":{
		"match_all":{}   ###把所有的文档结果匹配之后再做一次匹配过滤
		}
	 }
    }
}			

查询价格即是10元或productID又为SD1002136的结果

GET   /store/products/_search
{
	"query":{
		"filtered":{
		"filter":{
			"or":[
			{
			"term":{
				"price":10
				}
			},
			{
			"term":{
				"productID":"sd1002136"
				}
			}
		]
		},
		"query":{
		"match_all":{}   ###把所有的文档结果匹配之后再做一次匹配过滤
		}
	 }
    }
}	

not
查询productID不是SD1002136的商品

GET   /store/products/_search
{
	"query":{
		"filtered":{
		"filter":{
			"not":[
			{
			"term":{
				"price":10
				}
			},
		]
		},
		"query":{
		"match_all":{}   ###把所有的文档结果匹配之后再做一次匹配过滤
		}
	 }
    }
}	

range 范围查询
SELECT document FROM products WHERE price BETWEEN 20 AND 40
ge : > 大于
lt: < 小于
gte: >= 大于等于
lte: <= 小于等于

GET /store/products/_search
{
	"query":{
		"filtered":{
			"filter" :{
				"range":{
					"price":{
						"gte":20,
						"lt":40
						}
					}
				}
			}
		}
	}

建立数据
在这里插入图片描述
过滤空和非空
处理null空值的方法
SELECT tags FROM test WHERE tags IS NOT NULL
SELECT tags FROM test WHERE tags IS NULL

GET /test_index/test/_search
{
	"query":{
	"filtered":{
		"filter":{
			"exists":{"field":"tags"}    ##查询非空的情况
			}
		}
	}
}

GET /test_index/test/_search
{
	"query":{
	"filtered":{
		"filter":{
			"missing":{"field":"tags"}  ##查询都为空的
			}
		}
	}
}

cache 缓存
ES在执行带有filter查询时,会打开索引的每个segment文件(Lucene式底层文件),然后去判断里面的文档是否符合filter要求
注意:旧的segment文件不会变,新来的数据会产生新的segment
匹配的结果会用一个大型的BigSet数组来存储,这个数组的值只有0和1
匹配:1
不匹配:0
BigSet值是存在内存里的,而不是硬盘里,所以速度快
开启方式:在filter查询语句后面加上"_cache":true
注意:
Script filters,Geo-filters,Date ranges 这样的过滤方式开启cache无意义
exists,missing,range,term和terms查询是默认开启cache的
开启方式:
在这里插入图片描述
在这里插入图片描述
**

组合查询

**
1.bool查询
2.boosting 查询
3.constant_score查询
4.indices查询
bool 查询
1.bool查询
must,should,must_not
minimum_should_match: 表示一个文档至少匹配多少个短语才算是匹配成功
disable_coord: 弃用和禁用一个文档中所包含所有查询关键词的得分计算。默认是false
无Coordination 效果
含有apple的文档 -> 分值:1.5
含有apple jobs的文档 -> 分值:3.0
含有apple jobs mobile的文档 -> 分值:4.5
多一个词 分值多1.5
有Coordination 效果
含有apple的文档 -> 分值:1.5 *1/3 = 0.5
含有apple jobs的文档 -> 分值:3.0 * 2/3 = 2.0
含有apple jobs mobile的文档 -> 分值:4.5 * 3/3 = 4.5
2.boosting 查询
将2个查询封装在一起,然后可以降低一个查询结果返回的分值
positive 部分:查询返回的查询结果分值不变
negative 部分:查询的结果分值会被降低
negative_boost部分:设置 negative 中药降低的分值
优点:里面的2个查询都会有结果返回,其中一个分值就是你设置的分值
注意:如果是设有bool的must_not的话,那降低的那部分就没有结果返回
在这里插入图片描述
3.constant_score查询
优点:可以让一个查询得到一个恒定的分值

GET /library/books/_search
{
	"query""{
		"term":{
			"title":"elasticsearch"
			}
		}
}

GET /library/books/_search
{
	"query":{
	"constant_score":{
		"query":{
		"term":{
			"title":"elasticsearch"
			}
		}
	  }
    }
}
观察 _score的分值,第一个是变化的,第二个是恒定的值

4.indices查询
优点:可以在多个索引上进行查询
只有一个参数:no_match_query
查询其他索引里的数据
eg:

GET /_search
{
	"query":{
		"indices":{
			"indices":["library"],
				"query":{
					"term":{
						"title":"elasticsearch"
						}
					},
				"no_match_query":{
					"term":{
						"price":10
						}
					}
				}
			}
		}
	查询到的结果有别的索引里面的price 值为10 的,也有library 里面的匹配到的值。
  • 19
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ElasticSearch是一款基于Lucene的分布式搜索引擎,支持各种类型的查询。其中组合查询是指将多个查询条件组合起来进行查询,可以使用ElasticSearch的bool查询实现。 bool查询是一种复合查询,可以将多个查询条件组合起来,支持must、must_not、should、filter四种查询方式。 - must:表示必须匹配的查询条件,相当于“AND”的关系。 - must_not:表示必须不匹配的查询条件,相当于“NOT”的关系。 - should:表示可选匹配的查询条件,相当于“OR”的关系。 - filter:表示不评分的过滤条件,相当于must的变种,但它不会影响评分。 下面是一个使用bool查询实现组合查询的例子: ``` { "query": { "bool": { "must": [ { "match": { "title": "Elasticsearch" }}, { "match": { "content": "search" }} ], "must_not": [ { "match": { "content": "java" }} ], "should": [ { "match": { "author": "John" }}, { "match": { "tags": "elk" }} ], "filter": [ { "range": { "date": { "gte": "2022-01-01" }}} ] } } } ``` 上述查询语句中,我们使用bool查询将多个查询条件组合起来: - must条件表示title必须包含Elasticsearch,content必须包含search,相当于“Elasticsearch AND search”的关系。 - must_not条件表示content必须不包含java,相当于“NOT java”的关系。 - should条件表示author必须包含John,或tags必须包含elk,相当于“John OR elk”的关系。 - filter条件表示date必须大于等于2022-01-01,但不影响评分。 通过使用bool查询,我们可以实现各种复杂的组合查询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值