elasticsearch先实践再理论 四 查询

精确值查询 Term

term vs match

term:查询词不做分析,适用于如日期、bool、number、文本类型

match:查询词分析,并转化为term查询

下图查找结果为空,因为GOOD-NAME在索引时(这里索引是动词,代表插入文档)已经被分词器分词为两个词条good、name

可以设置字段为类型为keyword,这样在索引时不会分词,这样就能查询到了:

对于精确值查询尽量使用filter,filter不会评分且容易被缓存,所以filter的执行速度非常快,filter需要嵌套在bool或者constant_score中:

还有一个terms查询,相当于sql的in,文档和数组中任意一个数据值匹配即可:

{
	"query":{
		"terms":{
			"name.keyword":["GOOD-NAME","BAD-NAME"]
		}
	}
}

Match查询

term查询类似sql,match则比term高级一些:

{
    "query": {
        "match": {
        	"likes":"dota basketball"
        }
    }
}

likes是文本类型(非keyword),搜索词也会被分析(dota、basketball),最终转化为term查询:

{
    "query": {
        "bool": {
            "should":[
            	{"term":{"likes":"dota"}},
            	{"term":{"likes":"basketball"}}
            ]
        }
    }
}

若只想搜索出两个词都存在的文档:

{
    "query": {
        "match":{
        	"likes":{
        		"query":"dota basketball",
        		"operator":"and"
        	}
        }
    }
}

field之后不是直接跟关键词,而是一个json对象,operator默认是or,写成and和下面是等价的:

{
    "query": {
        "bool": {
            "must":[
            	{"term":{"likes":"dota"}},
            	{"term":{"likes":"basketball"}}
            ]
        }
    }
}

上面的查询和下面的也是等价的

{
    "query": {
        "bool": {
            "should":[
            	{"term":{"likes":"dota"}},
            	{"term":{"likes":"basketball"}}
            ],
            "minim
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值