22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度、基于boost的细粒度搜索条件实现权重控制...
本文章收录于【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的细粒度搜索条件实现权重控制...相关推荐
- Elasticsearch深度探秘搜索技术如何手动控制全文检索结果的精准度
为帖子数据增加标题字段 #插入数据 POST /post/_doc/_bulk { "update": { "_id": "1"} } { ...
- 白话Elasticsearch06- 深度探秘搜索技术之手动控制全文检索结果的精准度
文章目录 概述 数据 小例子 搜索标题中包含java或elasticsearch的blog 搜索标题中包含java和elasticsearch的blog 搜索包含java,elasticsearch, ...
- 白话Elasticsearch08-深度探秘搜索技术之基于boost的细粒度搜索条件权重控制
文章目录 概述 boost 示例 概述 继续跟中华石杉老师学习ES,第八篇 课程地址: https://www.roncoo.com/view/55 boost https://www.elastic ...
- 03 ElasticSearch笔记-搜索技术深入与集群架构原理
回顾: 1.通过term 和 match查询数据时细节点以及数据类型keyword与text区别 1.1 term查询 1.1.1 term查询keyword字段. term不会分词.而keyword ...
- geohash美团附近酒店搜索-技术方案
美团附近酒店搜索-技术方案 自Redis 3.2开始,Redis基于geohash和zset提供了地理位置相关功能. 什么是Geohash Geohash是一种地址编码,它能把二维的经纬度编码成一维的 ...
- 如何实施好基于MOSS的企业搜索项目(上)
文章目的:希望通过此文,能让读者了解搜索的本质和基于MOSS的企业搜索方案,在此基础上站在项目管理角度掌 握如何实施好这类方案的项目的关键点,确保企业搜索项目成功交付.由于文章长度限制,本文分上下两部 ...
- Elasticsearch深度探秘搜索技术基于multi_match语法实现dis_max+tie_breaker
直接上代码 GET /post/_search {"query": {"multi_match": {"query": "java ...
- 23_深度探秘搜索技术_best fields策略的dis_max、tie_breaker参数以及multi_match语法
目录 一.引入dis_max 实现best fields 的必要性 1.使用bulk批量添加测试数据 2.搜索title或content中包含java或solution的帖子 3.结果分析 二.bes ...
- 深度学习实践:计算机视觉_深度学习与传统计算机视觉技术:您应该选择哪个?
深度学习实践:计算机视觉 计算机视觉 (Computer Vision) Deep Learning(DL) is undeniably one of the most popular tools u ...
最新文章
- android view flipper,安卓控件——ViewFlipper
- iphone以旧换新活动_iPhone销量靠降价,安卓终于要赢了?
- android遍历拼接字符串,写个批处理脚本帮忙干活---遍历amp;字符串处理
- myeclipse去掉js报错
- 对人工智能产品发展的几点认识
- dfs序七个经典问题[转]
- 教育中的“产出/产能平衡”原则
- vue前端跨域解决方案
- 【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(2)
- 服务器网卡多路径配置文件,IPSAN(五)IPSAN多路径设置(客户端)
- 串口通信实验(通过串口控制LED、蜂鸣器)
- HBuilder手机Iphone运行提示“未受信用的企业级开发者”
- python爬百度贴吧_从零开始写Python爬虫 --- 1.5 爬虫实践: 获取百度贴吧内容
- 大数据全样而非抽样原理_大数据思维原理,你了解多少?
- 微服务之RPC(远程过程调用)的四种方式
- win10 开机软件自动启动设置
- Excel表格vlookup函数
- 华为会议终端TE10 SIP配置范例
- xxx学校/学院/大学信息管理系统
- 方差和偏差(Understanding the Bias-Variance Tradeoff)
热门文章
- 360 android 权限管理,各机型关于360手机卫士所需相关权限设置教程
- 一台电脑主机怎样连接两个显示器
- NFC smart tag竟然有四种 Type 1 Tag Type 2 Tag Type 3 Tag Type
- android模拟器计算器,兔子计算器模拟器Wabbitem
- PSP升级速度令然惊喜!(update:2007.10.13)
- C++入门编程实战(二)商品销售系统
- 写一篇关于《红楼梦》的论文,比较推荐的角度或者选题有哪些?
- GBK编码具体解析(附GBK码位分布图)
- 父类和子类方法的调用
- 新代系统怎样看服务器ip,新代系统FTP联网教程