六、ElasticSearch基本操作:精确查询
ES最关键的地方就在于查询
一.Query String
1、查询所有数据
GET 索引名称/_search
2、带参查询
GET 索引名称/_search/q=键:值
#例,只会去date里查询符合2022-06-01的
GET product/_search?q=date:2022-06-01
3、分页查询
#查询XX索引,从位置0开始,查询十条,以price排desc的序。
GET 索引名称/_search?from=0&size=10&sort=:price:desc
5、全文检索(在所有有索引的字段上进行检索)
#相当于在所有有索引的字段查询2022-06-01
GET product/_search?q=2022-06-01
6、数据结构查询
GET 索引名称/_mapping
二.DSL
关于查询,理解match和term的区别是非常重要的。
match和term最大的差别在于,查询条件是否分词。
举例说明
“xiaomi phone”,如果使用match查询是会分成两个词:xiaomi+phone,如果使用的是term则查询条件不分词:xiaomi phone。
1、全文检索match(match和term为参数条件)
1.match
match查询的是key对应的value,这里的key和value都会分词。
GET test/_search
{
"query": {
"match": {
"key": "value"
}
}
}
2.match_all
查询全部
GET test/_search
{
"query": {
"match_all": {}
}
}
3.multi_match
多字段查询,查询name或type中包含phone的数据
GET test/_search
{
"query": {
"multi_match": {
"query": "phone",
"fields": ["name","type"]
}
}
}
4.match_phrase
这个是最复杂的match查询,比较像term但是又和term不一样,以ni shi zhu为查询条件举例,ni shi zhu会被分词为"ni",“shi”,“zhu”,但是分词具有顺序,对应的value中必须包含这三个分词+顺序没有被打乱+中间没有插入任何词
GET test/_search
{
"query": {
"match_phrase": {
"word": "ni shi zhu"
}
}
}
2、精确查询term(查询条件不分词)(match和term为参数条件)
1.term
这里的查询条件不会分词,会按"ni shi zhu"直接在word里进行查询。
GET test/_search
{
"query": {
"term": {
"word": "ni shi zhu"
}
}
}
2.term与keyword
#数据类型如下
"text": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
对于text类型的字段,如果是"ni shi zhu",则会被分解为"ni",“shi”,"zhu"进行保存,只有在keyword字段才会查询到全称(keyword默认之为256,小于256字段长度取所有值,大于256则只截取前256个字符。)
GET test/_search
{
"query": {
"term": {
"text.keyword": "xiaomi nfc phone"
}
}
}
3.terms
#查询字段为FIELD,值为VALUE1和VALUE2的数据。
GET test/_search
{
"query": {
"terms": {
"FIELD": [
"VALUE1",
"VALUE2"
]
}
}
}
3、范围查询range
#查询字段为FIELD,大于等于10并小于等于20的所有数据。
#gt=大于 gte=大于等于
#lt=小于 lte=小于等于
GET test/_search
{
"query": {
"range": {
"FIELD": {
"gte": 10,
"lte": 20
}
}
}
}
4、filter和query的区别
1.查询对比
filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响。
query,会计算每个document相对于搜索条件的相关度,并按照相关度进行排序。
一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query;如果你只是要根据一些条件筛选出一部分数据,不关注排序,那么使用filter。
2.性能对比
filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的机制,自动cache最常使用filter的数据。
query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果。
5、组合查询bool
bool可以组合多个查询条件,bool查询是采用more_matches_is_better的机制,因此满足Must和should子句的文档会合并起来计算分值。
1.must:必须满足
must中可以使用term或者match,这里主要列举写法,而且写法基本上一样,只是修改了不同的条件。
GET test/_search
{
"query": {
"bool": {
"must": [
{"term": {
"FIELD": {
"value": "VALUE"
}
}}
]
}
}
}
GET test/_search
{
"query": {
"bool": {
"must": [
{"term": {
"FIELD": {
"value": "VALUE"
}
}},
{
"match_phrase": {
"FIELD": "PHRASE"
}
}
]
}
}
}
2.should:或
GET test/_search
{
"query": {
"bool": {
"should": [
{"term": {
"FIELD": {
"value": "VALUE"
}
}},
{
"match_phrase": {
"FIELD": "PHRASE"
}
}
]
}
}
}
3.must_not:必须不,不计分
GET test/_search
{
"query": {
"bool": {
"must_not": [
{"term": {
"FIELD": {
"value": "VALUE"
}
}},
{
"match_phrase": {
"FIELD": "PHRASE"
}
}
]
}
}
}
4.filter
GET test/_search
{
"query": {
"bool": {
"filter": [
{"term": {
"FIELD": {
"value": "VALUE"
}
}},
{
"match_phrase": {
"FIELD": "PHRASE"
}
}
]
}
}
}
5.minimum_should_match
GET test/_search
{
"query": {
"bool": {
"minimum_should_match": [
{"term": {
"FIELD": {
"value": "VALUE"
}
}},
{
"match_phrase": {
"FIELD": "PHRASE"
}
}
]
}
}
}