14、match all 等查询类型,多条件组合查询和利用filter进行查询的优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14、match all 等查询类型,多条件组合查询和利用filter进行查询的优化相关的知识,希望对你有一定的参考价值。

参考技术A 主要内容:match all 等查询类型,多条件组合查询和利用filter进行查询的优化,还简单介绍了排序以及字符串排序

查询所有:

匹配相关field的文本:

将一段搜索的文本使用到多个field上,例如 搜索test_field和test_field1上的匹配test的document

可以放在query和filter里面,例子:查询年龄大于35岁的员工

会将搜索词作为整个词到倒排索引中查询

指定多个term的搜索词:

title匹配xiaomi或者huawei的document

多条件的话,在query下加bool,然后在bool下可以加以下四种条件:
must,must_not,should,filter

每个子查询都会计算一个document针对它的相关度分数,然后bool综合所有分数,合并为一个分数,当然filter是不会计算分数的

当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包装起来。

如果用上面命令的格式构建查询,查询对象会将所有的条件绑定到一起存储到缓存中;因此如果我们查询人名相同但是出生年份不同的运动员,ElasticSearch无法重用上面查询命令中的任何信息。因此,我们来试着优化一下查询。由于一千个人可能会有一千个人名,所以人名不太适合缓存起来;但是年份比较适合:

我们使用了一个filtered类型的查询对象,查询对象将query元素和filter元素都包含进去了。第一次运行该查询命令后,ElasticSearch就会把filter缓存起来,如果再有查询用到了一样的filter,就会直接用到缓存。就这样,ElasticSearch不必多次加载同样的信息。

一般用在那种特别复杂庞大的搜索下,比如你一下子写了上百行的搜索,这个时候可以先用validate api去验证一下,搜索是否合法

如果对一个string field进行排序,结果往往不准确,因为分词后是多个单词,再排序就不是我们想要的结果了

通常解决方案是,将一个string field建立两次索引,一个分词,用来进行搜索;一个不分词,用来进行排序

创建示例索引

​ 插入数据

​ 开始查询,使用title.raw进行分词,title进行查询

参考的文章:

Elasticsearch查询性能优化 - https://www.jianshu.com/p/6b5ddb594b1b

相关拓展:

为什么Elasticsearch查询变得这么慢了? 大数据 铭毅天下(公众号同名)-CSDN博客 https://blog.csdn.net/laoyang360/article/details/83048087

多表查询之子查

1:子查询是将一个查询语句嵌套在另一个查询语句中。
2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
3:子查询中可以包含 IN,NOT IN,ANY,ALL,EXISTS  和 NOT EXISTS 等关键字
4:还可以包含比较运算符: =、!=、>、<等

还是以之前emp 与dep表格为例:

dep表格:

emp:表格

1 带in关键字子查询

先提供一个不带IN  的 关键字查询,用之前学的内连接查询如下:

用带in的关键字进行子查询

 

查看不足2人的部门名:

 

以上是关于14、match all 等查询类型,多条件组合查询和利用filter进行查询的优化的主要内容,如果未能解决你的问题,请参考以下文章

elasticSearch - 高级检索

51.多条件组合查询

ES Query DSL

016-elasticsearch-Query DSL-查询上下文,过滤上下文match_all

elasticsearch 查询 term和match

架构师成长记_第八周_15_dsl搜索- 布尔查询