match查询
单条件匹配查询
GET /索引名/类型名/_search
{
"query": {
"match": {
"文档字段名": "文档字段值"
}
}
}
GET yzq/user/_search
{
"query": {
"match": {
"name": "java"
}
}
}
如果文档中被匹配的字段包含中文则会进行模糊搜索,如果只有英文则会精确搜索,举例说明:
字段名 | 文档1 | 文档2 | 文档3 |
---|---|---|---|
name | java | java123 | java张三 |
如果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的所有文档文章来源:https://www.toymoban.com/news/detail-481790.html
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字段。文章来源地址https://www.toymoban.com/news/detail-481790.html
GET yzq/user/_search
{
"query": {
"match": {
"name": "java"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"需要匹配的字段名":{}
}
}
}
到了这里,关于Elasticsearch文档查询详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!