多字符串多字段查询

在ES中,Query Context 和Filter Context 是两种不同的上下文,其主要区别在于

  • Query Context 会进行相关性算分
  • Filter Context,不会进行相关性算分,性能更好

在ES中如果要进行复杂的查询,那么可以使用bool Query

bool 查询

一个bool查询是一个或者多个查询子句的组合

bool查询总共包含4种子句

子句类型 备注
must 必须满足该条件。结果会贡献算分
should 至少有一个满足条件。结果会贡献算分
must_not 必须不满足该条件。属于Filter Context查询子句,结果不会算分
filter 必须满足该条件。属于Filter Context查询子句,结果不会算分

算分,就是计算相关性。并不只是全文本检索才特有的,在yes或者no的子句中,匹配的子句越多,相关性评分就越高。如果多条查询子句被合并为一条符合查询语句,比如bool查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。

示例:

POST /products/_search
{"query": {"bool" : {"must" : {"term" : { "price" : "30" }},"filter": {"term" : { "avaliable" : "true" }},"must_not" : {"range" : {"price" : { "lte" : 10 }}},"should" : [{ "term" : { "productID.keyword" : "JODL-X-1937-#pV7" } },{ "term" : { "productID.keyword" : "XHDK-A-1293-#fJ3" } }],"minimum_should_tch" :1}}
}

意为:必须满足 price=30 并且avaliable=true 并且 price>10 或 productID ="JODL-X-1937-#pV7"或者 productID =“XHDK-A-1293-#fJ3”

bool查询中的子查询的顺序没有限制,且可以在子查询中嵌套多个子查询,如果bool查询中没有must条件,那么should中必须至少满足一条查询

bool查询语句的结构对算分的影响

bool查询语句的结构是会影响相关性算分的。

例如

//示例1
POST /animals/_search
{"query": {"bool": {"should": [{ "term": { "text": "brown" }},{ "term": { "text": "red" }},{ "term": { "text": "quick"   }},{ "term": { "text": "dog"   }}]}}
}//示例2
POST /animals/_search
{"query": {"bool": {"should": [{ "term": { "text": "quick" }},{ "term": { "text": "dog"   }},{"bool":{"should":[{ "term": { "text": "brown" }},{ "term": { "text": "brown" }},]}}]}}
}

示例1中,所有子句在同一层级下,则具有相同的权重

示例2,同示例一虽然是一个意思,但是子句的权重不一致,通过这种嵌套的bool查询,可以改变对算分的影响

通过boost字段控制相关度算分

boost参数的含义

  • 当boost > 1时,打分的相关度会相对性提升
  • 当0 < boost < 1时,打分的权重相对性降低
  • 当 boost < 0 时, 贡献负分

示例

DELETE blogs
POST /blogs/_bulk
{ "index": { "_id": 1 }}
{"title":"Apple iPad", "content":"Apple iPad,Apple iPad" }
{ "index": { "_id": 2 }}
{"title":"Apple iPad,Apple iPad", "content":"Apple iPad" }POST blogs/_search
{"query": {"bool": {"should": [{"match": {"title": {"query": "apple,ipad","boost": 1.1}}},{"match": {"content": {"query": "apple,ipad","boost":}}}]}}
}

解决包含而不是相等的问题

在我们 电影 索引中,有一个 genre字段,这个字段是数组,包含了多个数据,但是es中并没有数组类型,我们在查询时可能会出现这样的情况

可以看到,包含了同样关键字的数据都被查询了出来,所以索引设计上,我们需要增加一个字段,genre_count,对genre字段的数量进行统计。在查询时,使用复合查询,即可解决该问题

Elasticsearch 查询之 多字符串多字段查询相关推荐

  1. 【mybatis】mybatis自定义动态字段查询,mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段...

    mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段 先看一下 怎么实现动态的自定义字段查询: 例如: 而field 就是数据表中的某一个字段 String f ...

  2. ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)

    ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...

  3. Elasticsearch+Mongo亿级别数据导入及查询实践

    数据方案: 在Elasticsearch中通过code及time字段查询对应doc的mongo_id字段获得mongodb中的主键_id 通过获得id再进入mongodb进行查询   1,数据情况: ...

  4. 【Elasticsearch】 Elasticsearch 多字段查询 best_fields、most_fields、cross_fields,傻傻分不清楚?

    1.概述 转载:Elasticsearch 多字段查询 best_fields.most_fields.cross_fields,傻傻分不清楚? 1.1 题记 Multi-match query 的目 ...

  5. postgresql分割字符串_postgresql 实现字符串分割字段转列表查询

    在数据查询中,有一张a表存有另一张b表的id并以','隔开 如: 假设现在要关联查询关于 b表的一些信息,怎么办. 分割查询:字符串转列表函数 :regexp_split_to_table() sel ...

  6. es ik 多字段查询_SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询...

    背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...

  7. postgresql分割字符串_postgresql 实现字符串分割字段转列表查询_PostgreSQL_数据库

    在数据查询中,有一张a表存有另一张b表的id并以','隔开 如: 假设现在要关联查询关于 b表的一些信息,怎么办. 分割查询:字符串转列表函数 :regexp_split_to_table() sel ...

  8. ElasticSearch集成SpringData史上最全查询教程

    ElasticSearch集成SpringData史上最全查询教程 1.简单介绍 springboot 使用springdata操作es,ElasticsearchRepository使用QueryB ...

  9. ElasticSearch查询 第四篇:匹配查询(Match)

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

最新文章

  1. SLAM之特征匹配(二)————RANSAC--------翻译以及经典RANSAC以及其相关的改进的算法小结
  2. python免费入门教程-python小白如何入门,第一步要做什么?(附带免费教程)
  3. [转]另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  4. 小议看板列与职能筒仓
  5. 【python】使用plt.imshow(image)显示图片一片空白,像素值有数据
  6. Chrome扩展应用Infinity New Tab的备份
  7. lucene可用中文分词IKAnalyzer,maven pom下载代码及配置文件
  8. 连锁行业信息化的现状与问题
  9. Python生成二维码
  10. 携程的供应链和流量逻辑|一点财经
  11. google,翻译英文网站
  12. 看不见世界的程序员,开发了一款“吃鸡”
  13. 业界安全事件最新动态
  14. ubuntu命令 图片 壁纸_[教程]Ubuntu下完整配置自动壁纸切换
  15. virtualBox安装centos6增强包报错解决及配置共享文件夹
  16. HDU-5976-Detachment
  17. 服务器搭建SSH暴力攻击诱饵,制作密码字典
  18. **购买外链必须注意的四点经验_购链网**
  19. java jsch_java 利用jsch端口转发 建立连接
  20. 指针基础*p ;**pp

热门文章

  1. word中页面上下出现横线无法删除
  2. FAT32转NTFS的相互转化
  3. Java 跳出For循环总结
  4. Linux 查看文件和文件夹大小,数目等信息,查找‘.jpg’图像的个数
  5. 如何在html网页中加入椭圆按钮,如何在HTML5画布中绘制椭圆形?
  6. flask-sqlalchemy + flask-migrate orm迁移数据库
  7. 大学四年我这样学习大数据技术,成为了别人眼中的大神
  8. 快乐的生活 健康的过!
  9. 2022年上架谷歌安卓app市场注意事项
  10. 双硬盘分别安装windows和Ubuntu20双系统