基本语法
GET /索引库名/_search
{
"query":{
"查询类型":{
"查询条件":"查询条件值"
}
}
}
"query"代表一个查询对象,里面可以有不同的查询属性。
match_all
, match
,term
, range
等等GET /youshop/_search
{
"query": {
"match_all": {
}
}
}
结果如下:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "youshop",
"_type": "goods",
"_id": "1",
"_score": 1,
"_source": {
"title": "iphone xs max",
"price": 8848,
"images": "www.iphone.com",
"saleable": false
}
},
{
"_index": "youshop",
"_type": "goods",
"_id": "2",
"_score": 1,
"_source": {
"title": "iphone xs max",
"price": 8848,
"images": "www.iphone.com",
"saleable": true
}
}
]
}
}
match
类型查询,会把所查询字段的值进行分词,然后查询,分词之后词条之间的关系是or。
GET /索引库名/_search
{
"query": {
"match": {
"title": "小米手机"
}
}
}
在本例中,小米手机会被拆分为小米和手机两个词条,match采用的默认关系是or
,因此,搜索结果中只要包含这两个词条中的任何一个都可以。结果如下,小米手机以及小米电视都会被匹配到
"hits": [
{
"_index": "youshop",
"_type": "goods",
"_id": "4",
"_score": 1.5408844,
"_source": {
"title": "小米手机",
"images": "www.xiaomi.com",
"price": 2899,
"saleable": true
}
},
{
"_index": "youshop",
"_type": "goods",
"_id": "3",
"_score": 0.49917623,
"_source": {
"title": "小米电视",
"images": "www.xiaomidianshi.com",
"price": 3899,
"saleable": true
}
}
]
本例中如果想要单纯的匹配到小米手机这个文档,而不想找到小米电视,我们可以将词条间的默认关系or修改为and
GET /youshop/_search
{
"query":{
"match": {
"title": {
"query": "小米手机",
"operator": "and"
}
}
}
}
现在,搜索结果就只剩下小米手机了!
"hits": [
{
"_index": "youshop",
"_type": "goods",
"_id": "4",
"_score": 1.5408844,
"_source": {
"title": "小米手机",
"images": "www.xiaomi.com",
"price": 2899,
"saleable": true
}
}
]
在 or
与 and
间二选一有点过于非黑即白。 如果用户给定的条件分词后有 5 个查询词项,想查找只包含其中 4 个词的文档,该如何处理?将 operator 操作符参数设置成 and
只会将此文档排除。
有时候这正是我们期望的,但在全文搜索的大多数应用场景下,我们既想包含那些可能相关的文档,同时又排除那些不太相关的。换句话说,我们想要处于中间某种结果。
match
查询支持 minimum_should_match
最小匹配参数, 这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数
,因为我们无法控制用户搜索时输入的单词数量。
GET /youshop/_search
{
"query":{
"match":{
"title":{
"query":"小米曲面电视",
"minimum_should_match": "75%"
}
}
}
}
本例中,搜索语句可以分为3个词,如果使用and关系,需要同时满足3个词才会被搜索到。这里我们采用最小品牌数:75%,那么也就是说只要匹配到总词条数量的75%即可,这里3*75% 约等于2。所以只要包含2个词条就算满足条件了。
multi_match与match类似,但它可以在多个字段中查询
GET /youshop/_search
{
"query": {
"multi_match": {
"query": "小米",
"fields": ["title", "subTitle"]
}
}
}
从下图的查询结果中可以看到,副标题的包含小米
的文档也被搜索到了。
"hits": [
{
"_index": "youshop",
"_type": "goods",
"_id": "1",
"_score": 1.0,
"_source": {
"title": "iphone xs max",
"price": 8848.00,
"images": "www.iphone.com",
"saleable": false
}
},
{
"_index": "youshop",
"_type": "goods",
"_id": "3",
"_score": 1.0,
"_source": {
"title": "小米电视",
"images": "www.xiaomidianshi.com",
"price": 3899,
"saleable": true
}
},
{
"_index": "youshop",
"_type": "goods",
"_id": "4",
"_score": 1.0,
"_source": {
"title": "小米手机",
"images": "www.xiaomi.com",
"price": 2899,
"saleable": true
}
},
{
"_index": "youshop",
"_type": "goods",
"_id": "5",
"_score": 1.0,
"_source": {
"title": "红米手机",
"subTitle": "小米旗下",
"price": 8848.00,
"images": "www.iphone.com",
"saleable": true
}
}
]
term
查询被用于精确值匹配,这些精确值可能是数字、时间、bool或者那些未分词的字符串。
GET /youshop/_search
{
"query": {
"term": {
"price": {
"value": "3899"
}
}
}
}
索引库中的价格为3899的文档将被匹配到。
"hits": {
"total": 1,
"max_score": 1.0,
"hits": [
{
"_index": "youshop",
"_type": "goods",
"_id": "3",
"_score": 1.0,
"_source": {
"title": "小米电视",
"images": "www.xiaomidianshi.com",
"price": 3899,
"saleable": true
}
}
]
terms
查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件。
GET /youshop/_search
{
"query":{
"terms":{
"price":[2699.00,2899.00,3899.00]
}
}
}
默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source
的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source
的过滤。
GET /yosuhop/_search
{
"_source": ["title","price"],
"query": {
"term": {
"price": 2699
}
}
}
我们也可以通过:
二者都是可选的。
GET /heima/_search
{
"_source": {
"includes":["title","price"]
},
"query": {
"term": {
"price": 2699
}
}
}
GET /heima/_search
{
"_source": {
"excludes": ["images"]
},
"query": {
"term": {
"price": 2699
}
}
}