基于Elasticsearch5.5版本,不完全准确,从常用的开始写起,逐渐修改中……
详见官方文档
查询与过滤
用于查询(query)时:
需要判断这个文档是否匹配,同时需要判断匹配程度(评分查询 scoring queries)。
找出匹配文档并计算相关性,查询结果并不缓存。【倒排索引 inverted index】
用于过滤(filter)时:
只需判断这个文档是否匹配。
只用简单检查包含或者排除,计算迅速且缓存查询结果。
查询语法
match_all 查询:
匹配所有文档。
此时返回_score为1.0,若要修改此字段,用”boost”。
// "match_all"
GET index/type/_search
{
"query" : {
"match_all" : {}
}
}
// "boost"
GET index/type/_search
{
"query" : {
"match_all" : {
"boost" : 1.2
}
}
}
Full Text Queries (全文查询)
match 查询:
对全文text/数字numerics/日期dates等类型的字段使用,将使用分析器分析该字段再进行查询
对精确值(如keyword类型)字段使用,精确匹配
// 查询id为001的文档
GET index/type/_search
{
"query": {
"match": {
"id": "001"
}
}
}
multi_match 查询:
多字段单值
GET index/type/_search
{
"query": {
"multi_match": {
"query": "0",
"fields": ["index","state"] // index=0且state=0
}
}
}
QueryString查询: 【待完善】
查询单个字段时,在我看来,使用”and”,”or”没有啥区别
查询多个字段时,额情况有点复杂,先抄下官方文档的解释,以后确定再来修改
// 单字段多值
GET index_parkingorder_v1/parkingorder_info/_search
{
"query": {
"query_string": {
"default_field": "id",
"query": "001 and 002 or 003" // 试了一下,貌似id=001 id=002 id=003的文档都会返回,
// 若没有003的文档的话,也不会影响别的结果
}
}
}
// 多字段多值
GET index/type/_search
{
"query": {
"query_string": {
"fields": ["index","state"],
"query": "1 and 0" // 相当于: (index=1 or state=1) and (index=0 or state=0)
}
}
}
SimpleQueryString查询:
经常使用,支持单字段单值与多值,多字段单值与多值等
还有一些运算符号可以用:”+”,”-“,”*”,”|” 等
// 通配符*
GET index/type/_search
{
"query": {
"simple_query_string": {
"query": "王*",
"fields": ["name"]
}
}
}
//
GET index/type/_search
{
"query": {
"simple_query_string": {
"query": "001 -002", //返回id=001 or id!=002的文档,其中空格即"|",表示或者
"fields": ["id"] // "+"表示与,"-"表示否,可以连用
}
}
}
Term Level Queries(词级查询)
term 查询:
精确值(数字、时间布尔、not_analyzed的字段)查询
terms 查询:
exists 查询和missing 查询:
range 查询:
exists 查询:
wildcard 查询:
模糊查询,通配符 ? *。
目前我用这个查类型为keyword的字段,好用。
text类型貌似不太准确,或许被分词的缘故,待确定。
fuzzy 查询:
Compound Queries(复合查询)
bool 查询:
将多个查询组合一起,must(必须匹配)、must_not(必须不匹配)、should(若满足将增加_score)、filter(必须匹配,但不评分)
constant_score 查询:
Sort 排序:
string字段进行排序时,需要not_analyzed,映射中有个fields参数,可以设置对一个字段用两种方式索引