ElasticSearch笔记-查询

简介

查询有两种方式:

  • QueryString查询
    通过query参数传递查询语句(?q=name:zhangsan)
  • DSL查询
    通过DSL语句查询,可以写出灵活复杂的查询语句,语言以json请求体的形式出现

查询响应信息说明

{
    "took" : 346,          // 整个检索消耗的时间, 单位是毫秒,第一次查询慢,之后查询使用缓存
    "timed_out" : false,   // 默认不启用超时机制, 若启用, 需要设置具体的时间值
    "_shards" : {          // 搜索用到的shard数, 以及成功/失败的shard数
        "total" : 5,
        "failed" : 0       // 一个Shard的Primary和Replicas都挂掉, 它才被认为失败
    },
    "hits" : {
        "total" : 10,      // 本次搜索命中(搜索到)的结果总数
        "max_score" : 1.0, // 本次搜索的所有结果中, 最大的相关度分数
        "hits" : [         // 默认显示查询结果中的前10条记录, 根据_score降序排序
            {
                "_index" : "book_shop",
                "_type" : "books",
                "_id" : "2",
                "_score" : 1.0,  // 相关度得分, 越相关, 分值越大, 排位越靠前
                "_source" : {
                }
            } 
        ]
    }
}

文档是否存在:

HEAD index6/_doc/2008

id查询:

HEAD index6/_doc/2008

QueryString查询

//查询任一字段包含 Guide 的文档
GET index1/_search?q=guide

//查询name字段包含233的文档
GET index1/_search?q=name:233

//作用同上,查询name字段包含233的文档
GET index1/_search?q=+name:233

//查询name字段不包含233的文档
GET index1/_search?q=-name:233

//查询 按价格降序
GET /bookdb_index/book/_search?sort=price:desc

//分页
GET /_search?size=10&from=0

DSL查询

全部(默认返回10条数据)

GET index1/user/_search 
或
GET index1/_search 
或
GET index1/_search 
"query": {
    "match_all": {}
  }

mget多文档查询(查询两个索引库中指定type的指定id的数据)

POST _mget 
{
    "docs" : [
        {
            "_index" : "index2",
            "_type" : "user",
            "_id" : "1001"
        },
        {
            "_index" : "meshop-track-2021.11.27",
            "_type" : "track",
            "_id" : "qPvFeX0Bu22gu39gCvaD"
        }
    ]
}

mget多文档查询(查询id为1001、1002的数据)

POST index2/user/_mget 
{
"ids":[1001,1002]
}

term查询:

term主要用来精确匹配值,比如数字、日期、bool、未分词的字符串(不对搜索语句进行分词)

POST index1/_search 
{
	"query":{
		"term":{
			"age":18
		}
	}
}

terms查询:

terms和term类似,但允许指定多个匹配条件。如果字段指定了多个值,那么文档需要一起去做匹配
POST index1/_search

{
	"query":{
		"terms":{
			"age":[18,38]
		}
	}
}

range查询:

按指定范围查找数据

POST index1/_search 
{
	"query":{
		"range":{
			"age":
			{
				"gte":18,
				"lt":50
			}
		}
	}
}

exists查询:

用于查找文档中是否包含指定字段或没有某个字段,类似sql中的IS_NULL

POST index1/_search 
{
	"query":{
		"exists":{
			"field":"name"
		}
	}
}

排序

GET index5/people/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ]
}

分页

GET index5/people/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 2
}

match查询:

Full Text Search会对检索文本作分词处理, 然后从倒排索引中作匹配查询

默认取并集(OR)
GET index1/_search 
{
	"query":{
		"match":{
			"name":"张三 aaa"
		}
	}
}
取交集(AND)
GET index1/_search 
{
	"query":{
		"match":{
			"name":{"query":"张三 aaa","operator":"and"}
		}
            
	}
}

multi_match

是 match 的作为在多个字段运行相同操作的一个速记法。fields 属性用来指定查询针对的字段

GET index6/user/_search
{
    "query": {
        "multi_match" : {
            "query" : "fan",
            "fields" : ["name","description"]
        }
    }
}

由于我们是多个字段查询,我们可能需要提高某一个字段的分值。下面的例子修改authors字段的Boosting,把authors字段的分数提高3倍

GET /bookdb_index/_search
{
  "query": {
    "multi_match": {
      "query": "clinton gormley",
      "fields": ["authors^3","authors.keyword"]
    }
  }
}

模糊查询(Fuzzy)

在进行匹配和多项匹配时,可以启用模糊匹配来捕捉拼写错误,模糊度是基于原始单词的编辑距离来指定的。

POST /bookdb_index/book/_search
{
    "query": {
        "multi_match" : {
            "query" : "comprihensiv guide",
            "fields": ["title", "summary"],
            "fuzziness": "AUTO"
        }
    },
    "_source": ["title", "summary", "publish_date"],
    "size": 1
}

通配符查询(wildcard)

会对查询条件进行分词,还可以使用通配符?(单个字符)和*(0个或多个字符)

//查询姓名张开头的数据
GET index6/user/_search
{
  "query": {
    "wildcard": {
      "name": {
        "value": "张*"
      }
    }
  }
}

正则查询(regexp)

正则查询 让你可以使用比 通配符查询 更复杂的模式进行查询

GET index6/user/_search
{
  "query": {
    "regexp": {
      "name": "t[a-z]*y"
    }
  }
}

前缀查询(prefix)

GET index6/user/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "n"
      }
    }
  }
}

bool查询:

bool查询可以用来合并多个条件查询结果的布尔逻辑.
关键词:

关键词 描述
must 必须满足的条件,而且会计算分数
filter 必须满足的条件,性能比must高,不会计算分数
should 可以满足的条件,会计算分数
must_not 必须不满足的条件,不会计算分数

它包含操作符:must相当于and、must_not相当于not、should相当于or

GET index6/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "age": {
              "value": "20"
            }
          }
        },
        {
          "term": {
            "classid": {
              "value": "1"
            }
          }
        }
      ],
      "filter": [
        {"term": {
          "sex": "男"
        }}
      ],
      "must_not": [
        {"term": {
          "classid": {
            "value": 2
          }
        }}
      ]
    }
  }
}

过滤查询?

做精确搜索时,最好用过滤语句,因为过滤语句可以缓存数据

match_phrase

和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留包含了所有搜索词条的文档,并且词条的位置要邻接。,但可以设置 slop 值来指定查询项之间可以分隔多远的距离,结果仍将被当作一次成功的匹配。

GET /my_index/_search
{
    "query": {
        "match_phrase": {
            "title": "quick brown fox"
        }
    }
}

match_phrase查询也可以写成类型为phrase的match查询:

"match": {
    "title": {
        "query": "quick brown fox",
        "type":  "phrase"
    }
}

高亮显示:

GET index6/user/_search
{
  "query": {
    "match": {
      "name": "name1"
    }
  },
  "highlight": {
    "fields": {
      "name":{
        "pre_tags": "<em>",
        "post_tags": "</em>"
      }
    }
  }
}

queryString查询

查询根据操作符(如AND或NOT)来解析和分割所提供的查询字符串,然后独立分析每个分割文本,最后返回匹配的文档,query_string查询严格按照查询语法,如果查询字符串包含任何无效语法,则返回错误。

GET index6/user/_search
{
  "query": {
    "query_string": {
      "fields": ["name","sex"], 
      "query": "name1 OR name2 OR 张三 OR 女"
    }
  }
}

结果过滤

相当于SELECT子句,返回部分字段
简单查询:index1/_search?_source=id,name
DSL查询:

GET index5/people/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name","age"]
}

排重查询:

POST meshop-track-2020.12.05/track/_search

{
  "size":0,
  "query": 
  {
     "bool":
     {
            "must":
            [
                {"term":{"page_urlhost":"www.berniam.com"}},
                {"term":{"event_name":"page_view"}}
            ]
      }
  },
  "aggs": {
    "uid_aggs": {
      "cardinality": {
        "field": "doc_width"
      }
    }
  }    
}

search参数列表

参数 使用方法
q 查询字符串,案例:q=-field1:test #查找不满足条件的所有文档
from 从所有返回结果中的第几条开始显示, 默认为0.
size 搜索结果返回的条数. 默认为10, 即返回前10条.
df 查询中没有定义前缀时, 默认的搜索字段
analyzer 分析查询字符串所使用的分析器的名称
lowercase_expanded_terms 搜索时忽略大小写标识, 默认为true
analyze_wildcard 通配符或前缀查询是否被分析, 默认为false
batched_reduce_size 协调节点需要减少的分片结果数. 当分片数量很多时, 会产生很大的内存开销, 这个参数用来当做保护机制
default_operator 默认的多个条件之间的关系, 可以是 AND 或 OR. 默认是 OR.
lenient 如果设置为true, 字段类型转换失败时将忽略处理. 默认为false.
explain 在每个返回结果中, 将包含评分机制的详细计算描述.
_source 是否包含元数据, 同时支持_source_incude和_source_exclude.
stored_fields 选择查询到的文档的指定字段, 多个之间用","分隔. 若不指定任何字段, 就不会返回任何字段.
sort 根据字段名排序. 可以是fieldName, 或fieldName:desc, 或fieldName:asc, 或_score (给予分数的排序). 可以有多个排序参数, 要注意各参数之间的顺序.
timeout 搜索超时, 在指定的时间内执行搜索请求, 并在超时时间到期时返回查询到的已有结果. 默认无超时.
track_scores 跟踪评分. 排序时, 设置为true后将跟踪评分情况, 并在返回的结果中携带评分信息.
track_total_hits 设置为false, 禁止跟踪每个查询的结果总数. 默认为true, 即统计搜索到的结果总数.
terminate_after 每个分片搜索的最大文档数, 如果达到此值, 即使搜索尚未结束, 当前分片将提前终止搜索. 如果设置, 响应信息中将携带一个boolean类型的terminated_early字段, 表示查询提前终止了. 默认没有设置.
search_type 搜索的类型, 可以是dfs_query_then_fetch或query_then_fetch, 默认是query_then_fetch.
allow_partial_search_results 如果请求将产生部分结果, 设置为false用来返回整体故障. 默认为true,这将在超时或部分失败的情况下, 返回部分结果. 可以通过集群中的search.default_allow_partial_results来设置此参数

查询多索引数据

#### 同时搜索两个index下的数据
GET index1,index2/_search
#### 按照通配符匹配搜索多个index下的数据
GET *1,*2/_search 

timeout超时机制

指定每个Shard必须在规定的时间内将搜索到的数据 (可能只搜索到了部分数据, 也可能搜索到了全部数据) 立即返回给客户端, 而不是等待查询操作完全完成后再返回
ES的搜索默认不开启timeout, 可以手动指定timeout

GET _search?timeout=10ms
# 可用的单位: timeout=10ms | timeout=1s | timeout=1m

nested查询

nested查询搜索nested字段对象,就好像将它们作为单独的文档进行索引一样。如果对象匹配搜索,nested查询返回根父文档。

nested顶层参数

  • path (必选,字符串)您希望搜索的嵌套对象的路径。
  • query (必选,查询对象)您希望在路径中的嵌套对象上运行的查询。如果对象匹配搜索,嵌套查询返回根父文档。可以使用包含完整路径的点表示法搜索嵌套字段,比如obj1.name。
    多级嵌套将被自动支持和检测,从而导致内部嵌套查询自动匹配相关嵌套级别,而不是根,如果它存在于另一个嵌套查询中。
  • score_mode (可选,字符串)指示匹配子对象的得分如何影响根父文档的相关性得分。有效值:
    • avg 默认
    • max
    • min
    • none
    • sum
    • ignore_unmapped (可选,布尔值)指示是否忽略未映射的路径,不返回任何文档而不是错误。默认值为false。

案例

索引设置:

PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "obj1": {
        "type": "nested"
      }
    }
  }
}

查询:

GET /my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "obj1",
      "query": {
        "bool": {
          "must": [
            { "match": { "obj1.name": "blue" } },
            { "range": { "obj1.count": { "gt": 5 } } }
          ]
        }
      },
      "score_mode": "avg"
    }
  }
}

多级嵌套案例

PUT /drivers
{
  "mappings": {
    "properties": {
      "driver": {
        "type": "nested",
        "properties": {
          "last_name": {
            "type": "text"
          },
          "vehicle": {
            "type": "nested",
            "properties": {
              "make": {
                "type": "text"
              },
              "model": {
                "type": "text"
              }
            }
          }
        }
      }
    }
  }
}

查询:

GET /drivers/_search
{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "nested": {
          "path": "driver.vehicle",
          "query": {
            "bool": {
              "must": [
                { "match": { "driver.vehicle.make": "Powell Motors" } },
                { "match": { "driver.vehicle.model": "Canyonero" } }
              ]
            }
          }
        }
      }
    }
  }
}

参考:
https://www.cnblogs.com/shoufeng/p/10782328.html
https://www.cnblogs.com/xing901022/p/5335151.html (mget)

posted @ 2021-01-01 09:49  .Neterr  阅读(282)  评论(0编辑  收藏  举报