六、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"
          }
        }
      ]
    }
  }
}