Elasticsearch文档查询详解

match查询

单条件匹配查询

GET /索引名/类型名/_search
{
  "query": {
    "match": {
      "文档字段名": "文档字段值"
    }
  }
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }
}

如果文档中被匹配的字段包含中文则会进行模糊搜索,如果只有英文则会精确搜索,举例说明:

字段名文档1文档2文档3
namejavajava123java张三

如果name匹配java的话可以匹配到java、java张三但是匹配不到java123。

单字段多条件匹配查询

GET yzq/user/_search
{
  "query": {
    "match": {
      "文档字段名": "字段值1 字段值2"(多个字段值以空格分开)
    }
  }
}

查询索引中tags中包含男、技术关键词的文档,会检索出包含男关键词、技术关键词、以及两个都包含的文档,包含越多的查询排名越靠前。

GET yzq/user/_search
{
  "query": {
    "match": {
      "tags": "男 技术"
    }
  }
}

通常tags的值像是这样:“tags”: [“技术宅”,“温暖”,“直男”]

term查询

GET /索引名/类型名/_search
{
  "query": {
    "term": {
      "文档字段名": "文档字段值"
    }
  }
}
GET yzq/user/_search
{
  "query": {
    "term": {
      "name": "爪哇 java"
    }
  }
}

term和match关键字的区别在于是否将查询的字段值做拆分,以上面的GET查询为例。

  • 如果使用term则name字段不会被分词器拆分,因此本次查询会根据“爪哇 java”这个词到倒排索引中进行匹配;
  • 如果使用match则name字段会被分词器拆分为“爪哇”和“java”再拿这两个单次到倒排索引中进行匹配(或的关系,只要有一个匹配成就算成功)

text和keyword是指在建立索引时声明的某个字段的类型。

  • 如果是text则新插入文档时就会对该字段进行分词处理后,把分好的词写入倒排索引中,以上面的GET为例会把“爪哇”和“java”这两个词写入倒排索引
  • 如果是keyword则新插入文档时不会对该字段进行分析处理,直接把单次完整的写入倒排索引中,以上面的GET为例则只会把“爪哇 java”这个完整的词写入倒排索引

通常情况下是如下搭配:

  • match + text (如果是term + text,使用term查询时,查询条件不会进行分词。但是text类型的数据,在倒排索引中实际存储的是分词的数据。term条件区分大小写,而text数据经过默认的standard analyzer分词器分词,大写字母全部转为了小写字母,并存入了倒排索引以供搜索,所以这里需要注意大小写匹配的问题)
  • term + keyword(如果是match + keyword则等效term)

查询附加操作

筛选字段

如果不想要文档中的所有字段值的话可以通过_source字段来筛选出想要的值。附上格式和例子:

GET /索引名/类型名/_search
{
  "query": {
    "match": {
      "文档字段名": "文档字段值"
    }
  }
  "_source": ["字段1", "字段2", ...]
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }, 
  "_source": ["name", "desc"]
}

排序

GET /索引名/类型名/_search
{
  "query": {
    "match": {
      "文档字段名": "文档字段值"
    }
  }
  "sort": [
  	{
		"文档字段名": {
			"order": "asc"/"desc"(二选一)
		}
	}
  ]
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }, 
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

limit操作

GET /索引名/类型名/_search
{
  "query": {
    "match": {
      "文档字段名": "文档字段值"
    }
  }
  "sort": [
  	{
		"文档字段名": {
			"order": "asc"/"desc"(二选一)
		}
	}
  ]
  "from": 从哪开始(默认第一条文档下标为0),
  "size": 截取多少条
}
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  }, 
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}

多条件查询

这种查询支持多个条件同时查询,这些条件的关系可以是AND(must)和OR(should)

AND查询

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "文档字段名1": "文档字段值1"
          }
        },
        {
          "match": {
            "文档字段名2": 文档字段值2
          }
        }
      ]
    }
  }
}

查询索引中name匹配java而且age为23的文档

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "java"
          }
        },
        {
          "match": {
            "age": 23
          }
        }
      ]
    }
  }
}

OR查询

GET yzq/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "文档字段名1": "文档字段值1"
          }
        },
        {
          "match": {
            "文档字段名2": 文档字段值2
          }
        }
      ]
    }
  }
}

查询索引中name匹配java或者age为23的文档

GET yzq/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "java"
          }
        },
        {
          "match": {
            "age": 23
          }
        }
      ]
    }
  }
}

不等于查询

关键字must_not

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "文档字段名": 文档字段值
          }
        }
      ]
    }
  }
}

查询索引中age不等于3的文档

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": 3
          }
        }
      ]
    }
  }
}

范围查询

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "java"
          }
        }
      ],
      "filter": {
        "range": {
          "文档字段名": {
            "gte": 值大于等于多少,也可以是大于多少(gt),
            "lte": 值小于等于多少,也可以是小于多少(lt)
          }
        }
      }
    }
  }
}

查询索引中name匹配java的文档中并且age值小于10的所有文档

GET yzq/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "java"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "lt": 10
          }
        }
      }
    }
  }

查询索引中age大于等于10且小于等于30的所有文档

GET yzq/user/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 30
      }
    }
  }
}

高亮查询

  • 默认高亮显示的标签是em,也可以日通过pre_tags和post_tags改成自己想要的标签,遵循html页面的写法。
GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  },
  "highlight": {
    "pre_tags": "想要定义的前缀", 
    "pre_tags": "想要定义的后缀",
    "fields": {
      "需要匹配的字段名":{} 
    }
  }
}

查询索引中name匹配java的所有文档,并高亮显示查询的name字段。

GET yzq/user/_search
{
  "query": {
    "match": {
      "name": "java"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>", 
    "post_tags": "</p>",
    "fields": {
      "需要匹配的字段名":{} 
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值