Elasticsearch入门教程:基础查询

Elasticsearch入门教程:基础查询

ElasticSearch查询

​ term系列:精确搜索

​ match系列:精确搜索、模糊搜索

​ exists:指定字段存在(有值)

​ prefix:前缀匹配,只能是keyword类型的字段

​ wildcard:通配符

​ regexp:正则表达式匹配

​ ids:根据id进行查询

​ range:根据范围进行查询

term系列:

(1)term

post localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"term":{
    
    
			"goods_name":"苹果"
		}
	}
}

既然是查询,那都是写在"query"字段里的。

匹配机制是equals,指定字段的值要相等才算匹配,返回所有匹配的document,即精确搜索。

如果是float这种数值型,10.0、10是equals的,也算是匹配的。

(2)terms

POST localhost:9200/mall/_search
{
    
    
"query":{
    
    
    "terms":{
    
    
    	"goods_name":["桃子","梨子"]
    }
 }
}

数组,只要是该字段的值是数组中的任意一个元素,就认为该文档匹配。

不管是term、还是terms,都只能是一个字段,不能使用多个字段进行查询。

分析一下返回的数据

{
    
    
    "took": 2,  #took是take的过去式,搜索花费的时间,ms
    "timed_out": false,  #本次搜索是否超时
    "_shards": {
    
      #分片信息
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
    
    
        "total": {
    
      
            "value": 2,  #匹配的document的数量
            "relation": "eq"  #关系是匹配
        },
        "max_score": 1.0,  #最大的socre,ES会给每个document分配一个score,搜索结果按score升序排列
        "hits": [
            {
    
    
                "_index": "mall",  #index
                "_type": "_doc",  #type
                "_id": "2",  #document的id
                "_score": 1.0,  #score
                "_source": {
    
      #数据
                    "goods_name": "桃子",
                    "goods_price": 3.0,
                    "goods_description": "新鲜桃子,3元一斤"
                }
            },
            {
    
    
                "_index": "mall",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
    
    
                    "goods_name": "梨子",
                    "goods_price": 5.0,
                    "goods_description": "新鲜桃子,5元一斤"
                }
            }
        ]
    }
}

match系列

(1)match_all

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"match_all":{
    
    }
	}
}

返回的所有的document,match_all里面不能有字段

(2)match、match_phrase

POST loaclhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"match":{
    
    
			"goods_description":"桃子"
		}
	}
}

如果使用text类型的字段,会使用分词器分词进行搜索,比如上面会拆分为"梨"、"子"2个字符,只要商品描述中含有"梨"字或"子"字,就认为该文档匹配,即模糊查询。

如果match中写text之外的字段,比如写keyword类型,那效果和term一样,都是精确匹配。

match、match_phrase的效果、使用方式都一样,都只能写一个字段。

(3)multi_match

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"multi_match":{
    
    
			"query":"苹果",
			"filds":["goods_name","goods_description"]
		}
	}
}

multi_match可以写多个字段,只要某一个字段匹配了,就认为该文档匹配。

商品名称匹配“苹果”或商品描述匹配“苹果”,就认为该文档匹配。text类型是模糊匹配,其它类型是精确匹配。

(4)match_phrase_prefix

POST localhost:9200/mall/_search
{
    
    
 "query": {
    
    
    "match_phrase_prefix": {
    
    
        "goods_description":"子"
     }
 }
}

模糊匹配。只能写一个字段,且该字段必须是text类型。

exits

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"exits":{
    
    
			"filds":"goods_description"
		}
	}
}

只要指定字段有值(存在),就认为该文档匹配

prefix

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"exits":{
    
    
			"goods_name":"梨"
		}
	}
}

prefix中只能写text或keyword类型的字段。

prefix只对keyword类型的字段有效,该字段的值以指定字符串开头,就认为该文档匹配。

也能写text类型的字段,但返回值是空

wildcard

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"wildcard":{
    
    
			"goods_name":"*瓜"
		}
	}
}

值可以使用通配符,*表示任意字符串,?表示任意一个字符。

wildcard是精确匹配,值必须equals才能匹配。比如"*瓜"可以匹配"冬瓜"、“哈密瓜”,但匹配不了"冬瓜苗"。

regexp 正则表达式匹配

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"regexp":{
    
    
			"goods_name":".*瓜"
		}
	}
}

ids

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"ids":{
    
    
			"values":[1,2,3]
		}
	}
}

根据id来查询,如果有该id,就返回对应的文档。

数值型id引不引用都行,非数值型id需要引起来。

没有id这种查询方式,就算只查一个id,也要写成数组形式。

range

POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"range":{
    
    
			"time":{
    
    
				"gte": "2018-03-02T09:39:12.000Z",
            	"lte": "2018-03-02T13:00:00.000Z"
			}
		}
	}
}
POST localhost:9200/mall/_search
{
    
    
	"query":{
    
    
		"range":{
    
    
			"price":{
    
    
				"gte": 20,
            	"lte": 40
			}
		}
	}
}

说明

​ 使用GET、POET均可

​ 使用的是所有的匹配的文档

​ 使用哪个字段进行匹配,可以由用户指定,前端给出搜索选项“按标题进行搜索”、“按内容进行搜索”…也可以使用固定的字段进行搜索,比如搜索商品,只按商 品名称进行搜索。

​ 值由用户输入,前端把搜索框的值传递给后台,后台查询ES。

​ (text字段似乎和分词器有关,如果该text字段使用内置分词器,无效,返回空;使用第三方分词 器,有效,效果和keyword相同)

​ 结果可分页,只返回结果集中指定的文档

POST localhost:9200/mall/_search
{
    
    
	"query"{
    
    
		
	},
	"from":0,  #从结果集中的第一个文档开始
	"size":20  #取20个文档。结果集中的文档是按score升序排列的
}

猜你喜欢

转载自blog.csdn.net/qq_44918331/article/details/111034963