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)