失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度 基于boost的细粒度搜索

22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度 基于boost的细粒度搜索

时间:2024-01-04 00:51:10

相关推荐

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的细粒度搜索条件实现权重控制...

如果觉得《22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度 基于boost的细粒度搜索》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。