Elasticsearch实现复合查询以及mysql like查询实现
不多说了,都是坑,踩爆我了,直接撸方法
需求
我要时间关键字one
搜索,索引type里面包含有如下关键字:iphonex
,test one
等文档
再如,我要搜索一个
,文档中字段有类似如下的内容:一个很好的
、一口好吃的
结果都会搜索出来,关键字一个
被分词一
了,所以都搜索出来的
此时我们只想简简单单单单纯纯的搜索出包含一个
的关键字文档出来而已,只想简简单单的。。。。
案例
好勒,条件如下,拿过去用吧
{
"query":{
"bool":{
"should":[
{
"match":{
"title":{
"query":"one",
"type":"phrase"
}
}
},
{
"wildcard":{
"title":"*one*"
}
}
],
"minimum_should_match":"50%",
"must":[
{
"match":{
"state":1
}
},
{
"terms":{
"type":[
1,
2
]
}
},
{
"range":{
"start_time":{
"gte":"2018-12-04 16:24:06"
}
}
}
]
}
},
"sort":{
"id":{
"order":"desc"
}
}
}
案例说明
"should":[
{
"match":{
"title":{
"query":"one",
"type":"phrase"
}
}
},
{
"wildcard":{
"title":"*one*"
}
}
],
"minimum_should_match":"50%",
对于关键词模糊搜索我选用了should
类似mysql的or
,进行关键词搜索以及wildcard
模式进行左右*
匹配搜索
最开始我在match的时候出现了文章开始出现的问题 ,后来也是度娘了需求,虽然那啥,我明白是什么问题,但是从了解到使用es不到两天,不过还在搞出来了,有两种方法不让一个
被拆分搜索匹配:
方法一
"match_phrase" : {
"title": { "query": "一个", "slop": 2} }
}
slop
值设置在搜索关键字被拆分搜索时,多个关键字间隔多少个其他字符从可以被匹配
方法二
"match":{
"title":{
"query":"one",
"type":"phrase"
}
}
加入匹配类型"type":"phrase"
,因此关键词可以进行整词搜索不被切开了(蛋疼)。
注意事项
在用了should
之后我用了"minimum_should_match":"50%",
条件,看到没,不加这货的话,复合查询的时候should
里面关键字搜索不到结果其他的包含关键字的也可能会被搜出来的,should
本来就是or,可有可无咯。。。
"minimum_should_match":"50%",
必须放在should
之后挨着放,别放错位置了,50%
至少满足should
里面50%条件的结果就匹配出来,当然不满足里面关键字条件的,肯定是不会出来的(?这句话就别放心上了 )
range时间筛选
"range":{
"start_time":{
"gte":"2018-12-04 16:24:06"
}
}
范围操作符包含:
gt :: 大于
gte:: 大于等于
lt :: 小于
lte:: 小于等于
需要支持这样的通过时间进行筛选的话,需要对start_time字段进行mapping设置格式才可以这样用,怎么设置点击Elasticsearch根据日期(年-月-日 时:分:秒)进行range(时间范围筛选)
结束
因为是复合查询,因此should
实现了like
之后其他条件就得must
(实现and
)去搞定了
结束了,实践一点,就写一点笔记