本文章收录于【Elasticsearch 系列】,将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解、ES调优、海量数据处理等

本博客以例子为主线,来说明在elasticsearch中如何手动控制全文检索结果的精准度

1、数据的预处理

创建article索引,并增加数据

POST article/_bulk
{ "create": { "_id": "1"} }
{"title" : "this is java and elasticsearch blog"}
{ "create": { "_id": "2"} }
{"title" : "this is java blog"}
{ "create": { "_id": "3"} }
{"title" : "this is elasticsearch blog"}
{ "create": { "_id": "4"} }
{"title" : "this is java, elasticsearch, hadoop blog"}
{ "create": { "_id": "5"} }
{"title" : "this is spark blog"}

2、搜索标题中包含java或elasticsearch的数据

这个就term query不一样了。不是搜索exact value,是进行full text全文检索。

match query就是负责进行全文检索的。当然如果要检索的field是not_analyzed类型的,那么match query也相当于term query。

GET article/_search
{"query": {"bool": {"must": [{"match": {"title": "java elasticsearch"}}]}}
}

使用诸如上面的match query进行多值搜索的时候,es会在底层自动将这个match query转换为bool的语法

bool should:指定多个搜索词,同时使用term query

{"bool": {"should": [{ "term": { "title": "java" }},{ "term": { "title": "elasticsearch"   }}]}
}

3、搜索标题中包含java和elasticsearch的数据

搜索结果精准控制的第一步:灵活使用and关键字,如果你是希望所有的搜索关键字都要匹配的,那么就用and,可以实现单纯match query无法实现的效果

GET article/_search
{"query": {"bool": {"must": [{"match": {"title": {"query": "java elasticsearch","operator": "and"}}}]}}
}

使用and match进行搜索的时候,es底层会自动转换为term + must 的语法进行搜索

{"bool": {"must": [{ "term": { "title": "java" }},{ "term": { "title": "elasticsearch"   }}]}
}

4、搜索包含java、elasticsearch、spark、hadoop4个关键字中,至少拥有3个的数据

控制搜索结果的精准度的第二步:指定一些关键字中,必须至少匹配其中的多少个关键字,才能作为结果返回

GET article/_search
{"query": {"bool": {"must": [{"match": {"title": {"query": "java elasticsearch spark hadoop","minimum_should_match": "75%"}}}]}}
}

使用 minimum_should_match 进行搜索时,es底层会自动转换为如下的语法

{"bool": {"should": [{ "term": { "title": "java" }},{ "term": { "title": "elasticsearch"   }},{ "term": { "title": "hadoop" }},{ "term": { "title": "spark" }}],"minimum_should_match": 3 }
}

5、用bool组合多个搜索条件来搜索title

搜索标题中包含java 并且不包含spark,或者title包含hadoop和elasticsearch的数据

GET article/_search
{"query": {"bool": {"must": {"match": {"title": "java"}},"must_not": {"match": {"title": "spark"}},"should": [{"match": {"title": "hadoop"}},{"match": {"title": "elasticsearch"}}]}}
}

6、bool组合多个搜索条件,如何计算相关度分值(relevance score)

计算规则:must和should搜索对应的分数,加起来,除以must和should的总数

在第5项的查询条件返回的结果中

排名第一:java,同时包含should中所有的关键字,hadoop,elasticsearch

排名第二:java,同时包含should中的elasticsearch

排名第三:java,不包含should中的任何关键字

should是可以影响相关度分数的

must是确保说,谁必须有这个关键字,同时会根据这个must的条件去计算出document对这个搜索条件的relevance score。在满足must的基础之上,should中的条件,不匹配也可以,但是如果匹配的更多,那么document的relevance score就会更高

7、搜索java、hadoop、spark、elasticsearch至少包含其中3个关键字

默认情况下should是可以不匹配任何一个的。比如上面的搜索中“this is java blog”就不匹配任何一个should条件。

但是有个例外的情况:如果没有must的话,那么should中必须至少匹配一个才可以。比如下面的搜索中should有4个条件,默认情况下只要满足其中一个条件,就可以匹配作为结果返回,但是我们可以精准控制should的4个条件中,至少匹配几个才能作为结果返回。

GET article/_search
{"query": {"bool": {"should": [{"match": {"title": "java"}},{"match": {"title": "elasticsearch"}},{"match": {"title": "hadoop"}},{"match": {"title": "spark"}}],"minimum_should_match": 3}}
}

8、基于boost的细粒度搜索条件的权重控制

搜索条件的权重boost可以将某个搜索条件的权重加大。当匹配这个搜索条件和匹配另一个搜索条件的document,来计算relevance score时,匹配权重更大的搜索条件的document的relevance score分数会更高,当然也就会优先被返回回来。默认情况下,搜索条件的权重都是一样的,都是1。

需求:搜索标题中包含java或spark或elasticsearch的数据,并且要求包含elasticsearch的数据优先搜索出来

GET article/_search
{"query": {"bool": {"should": [{"match": {"title": "spark"}},{"match": {"title": "java"}},{"match": {"title": {"query": "elasticsearch","boost": 5}}}]}}
}

如果我们不加boost来进行搜索的权限控制,es则会使用默认权重进行计算。如下图,我们就会发现包含spark 的数据会优先被搜索出来

总结:

1、全文检索的时候进行多个值的检索有两种做法:match query、should

2、控制搜索结果精准度:and operator、minimum_should_match

3、搜索条件权重控制:boost

< END >

本文章收录于【Elasticsearch 系列】,将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解、ES调优、海量数据处理等

22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度、基于boost的细粒度搜索条件实现权重控制...相关推荐

  1. Elasticsearch深度探秘搜索技术如何手动控制全文检索结果的精准度

    为帖子数据增加标题字段 #插入数据 POST /post/_doc/_bulk { "update": { "_id": "1"} } { ...

  2. 白话Elasticsearch06- 深度探秘搜索技术之手动控制全文检索结果的精准度

    文章目录 概述 数据 小例子 搜索标题中包含java或elasticsearch的blog 搜索标题中包含java和elasticsearch的blog 搜索包含java,elasticsearch, ...

  3. 白话Elasticsearch08-深度探秘搜索技术之基于boost的细粒度搜索条件权重控制

    文章目录 概述 boost 示例 概述 继续跟中华石杉老师学习ES,第八篇 课程地址: https://www.roncoo.com/view/55 boost https://www.elastic ...

  4. 03 ElasticSearch笔记-搜索技术深入与集群架构原理

    回顾: 1.通过term 和 match查询数据时细节点以及数据类型keyword与text区别 1.1 term查询 1.1.1 term查询keyword字段. term不会分词.而keyword ...

  5. geohash美团附近酒店搜索-技术方案

    美团附近酒店搜索-技术方案 自Redis 3.2开始,Redis基于geohash和zset提供了地理位置相关功能. 什么是Geohash Geohash是一种地址编码,它能把二维的经纬度编码成一维的 ...

  6. 如何实施好基于MOSS的企业搜索项目(上)

    文章目的:希望通过此文,能让读者了解搜索的本质和基于MOSS的企业搜索方案,在此基础上站在项目管理角度掌 握如何实施好这类方案的项目的关键点,确保企业搜索项目成功交付.由于文章长度限制,本文分上下两部 ...

  7. Elasticsearch深度探秘搜索技术基于multi_match语法实现dis_max+tie_breaker

    直接上代码 GET /post/_search {"query": {"multi_match": {"query": "java ...

  8. 23_深度探秘搜索技术_best fields策略的dis_max、tie_breaker参数以及multi_match语法

    目录 一.引入dis_max 实现best fields 的必要性 1.使用bulk批量添加测试数据 2.搜索title或content中包含java或solution的帖子 3.结果分析 二.bes ...

  9. 深度学习实践:计算机视觉_深度学习与传统计算机视觉技术:您应该选择哪个?

    深度学习实践:计算机视觉 计算机视觉 (Computer Vision) Deep Learning(DL) is undeniably one of the most popular tools u ...

最新文章

  1. android view flipper,安卓控件——ViewFlipper
  2. iphone以旧换新活动_iPhone销量靠降价,安卓终于要赢了?
  3. android遍历拼接字符串,写个批处理脚本帮忙干活---遍历amp;字符串处理
  4. myeclipse去掉js报错
  5. 对人工智能产品发展的几点认识
  6. dfs序七个经典问题[转]
  7. 教育中的“产出/产能平衡”原则
  8. vue前端跨域解决方案
  9. 【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(2)
  10. 服务器网卡多路径配置文件,IPSAN(五)IPSAN多路径设置(客户端)
  11. 串口通信实验(通过串口控制LED、蜂鸣器)
  12. HBuilder手机Iphone运行提示“未受信用的企业级开发者”
  13. python爬百度贴吧_从零开始写Python爬虫 --- 1.5 爬虫实践: 获取百度贴吧内容
  14. 大数据全样而非抽样原理_大数据思维原理,你了解多少?
  15. 微服务之RPC(远程过程调用)的四种方式
  16. win10 开机软件自动启动设置
  17. Excel表格vlookup函数
  18. 华为会议终端TE10 SIP配置范例
  19. xxx学校/学院/大学信息管理系统
  20. 方差和偏差(Understanding the Bias-Variance Tradeoff)

热门文章

  1. 360 android 权限管理,各机型关于360手机卫士所需相关权限设置教程
  2. 一台电脑主机怎样连接两个显示器
  3. NFC smart tag竟然有四种 Type 1 Tag Type 2 Tag Type 3 Tag Type
  4. android模拟器计算器,兔子计算器模拟器Wabbitem
  5. PSP升级速度令然惊喜!(update:2007.10.13)
  6. C++入门编程实战(二)商品销售系统
  7. 写一篇关于《红楼梦》的论文,比较推荐的角度或者选题有哪些?
  8. GBK编码具体解析(附GBK码位分布图)
  9. 父类和子类方法的调用
  10. 新代系统怎样看服务器ip,新代系统FTP联网教程