十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这期内容当中小编将会给大家带来有关如何解析elasticsearch中的DSL查询,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
目前成都创新互联已为上千的企业提供了网站建设、域名、虚拟主机、网站托管、企业网站设计、大理州网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
ES提供了基于JSON的完整查询DSL,它由两种子句组成
##1.查询分类 1>基本查询
常用查询命令:match、term、range。
2>复合查询
复合查询由一个基本查询或者多个基本查询组成,用逻辑方式组合(bool或者dis_max),或者更改查询条件的行为(constant_score)。
3>ES还允许一种昂贵查询,暂时用不到,就不在这里记录,详情查看官网。
##2.查询与过滤上下文
我们使用_search API来检索相关内容
由图可知:took表示本次查询所花时间,time_out表示本次查询是否超时,hits节点中是查询到的内容。
常用的查询参数如下:
query,指定查询条件
match,模糊查询,eg:查询"张",会将小张、张三等查询出来
term,精确查找,eg: age=33
bool,多条件联合查询
must,用于bool条件下,eg: name="zhang san" and age="33"
should,用于bool条件下,eg:name="zhang san" or age="33"
filter,过滤检索结果
range,区间查询,eg:price > 8000
下面造数据举例上面常用的查询指令PUT /user/_doc/1 { "id":1001, "name":"张三", "age":30, "sex":"0", "add_time":"2020-09-22" }
PUT /user/_doc/2 { "id":1002, "name":"张七", "age":35, "sex":"0", "add_time":"2020-09-24" }
term表示完全匹配,也就是精确查询,检索前不会再对检索词进行分词拆解。如上的数据中,我们来检索"张三"
发现没有检索到数据,这是为什么呢?从es的官网得知,term属于精确匹配,只能检索单个词,eg:我们检索"三",
发现就被检索出来了。那我们的希望是精确查找"张三",应该怎么做呢?这时候我们就用到了复合查询,如下
bool表示复合查询标志,must表示之内的条件必须同时满足。
这里为什么要采用复合查询的方式才能检索出数据呢?这是因为name这个词在进行存储的时候,就做了分词处理。我这里是采用默认分词器进行分词处理的,我们可以查看下默认分词器是如何处理的,
好了,term理解清楚了,再来看match
我们还是检索"张三",得出的结果如下,
咦,"张七"咋个被检索出来了?这是因为match进行检索的时候,会先进行检索词拆分,拆完后,再根据单个词去检索,所以如上的检索结果是:包含"张"与"三"的词都会被检索出来。
扩展一下,如果想查询包含"张三"的语句,即"张三"要紧邻在一起出现,采用match_phrase,
上述就是小编为大家分享的如何解析elasticsearch中的DSL查询了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。