hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!
- 起始标记->深入搜索(13讲):「28 | 单字符串多字段查询:Dis Max Query」
- 结尾标记->深入搜索(13讲):「29 | 单字符串多字段查询:Multi Match」
单字符串多字段查询:Dis Max Query
单字符查询的实例
- 博客标题
- 文档1中出现"Brown"
- 博客内容
- 文档1中出现了"Brown"
- "Brown fox"在文档2中全部出现,并且保持和查询一致的顺序(目测相关性最高)
算分过程
- 查询should语句中的两个查询
- 加和两个查询的评分
- 乘以匹配语句的总数
- 除以所有语句的总数
Disjunction Max Query查询
- 上例中,title和body相互竞争
- 不应该将分数简单叠加, 而是应该找到单个最佳匹配的字段的评分
- Disjunction Max Query
- 将任何与任一查询匹配的文档作为结果返回。采用字段上最匹配的评分最终评分返回
通过 Tie Breaker 参数调整
- 获得最佳匹配的语句的评分 _score.
- 将其他匹配语句的评分与tie_breaker相乘
- 对以上评分求和并规范化
- Tier Breaker 是一个介于0-1之间的浮点数。0 代表使用最佳匹配;1 代表所有语句同等重要。
本节知识回顾
通过bool查询去满足单个字符串对多个字段的查询,bool查询如果用should的方式进行,它是简单的将各个字段上的评分做一个加和,当处理有一些特殊的净增字段的场景时,返回的算分并不满足我们的期望,这个时候我们就可以引入一个复合查询叫Disjunction Max Query,Disjunction Max Query的逻辑是返回这些字段当中评分最高的一个作为整体的算分,当我们需要在Disjunction Max Query的时候引入一些其他字段的算分的影响的时候,我们可以通过控制tie_breaker的参数,对这个算分进行适当的调整。
CodeDemo
PUT /blogs/_doc/1 { "title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen." }
PUT /blogs/_doc/2 { "title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis." }
POST /blogs/_search { "query": { "bool": { "should": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } } }
POST blogs/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ] } } }
POST blogs/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ], "tie_breaker": 0.2 } } }
相关阅读
单字符串多字段查询:Multi Match
三种场景
- 最佳字段 (Best Fields)
- 当字段之间相互竞争, 又相互关联。例如title和body这样的字段。评分来自最匹配字段
- 多数字段(Most Fields)
- 处理英文内容时: -种常见的手段是,在主字段( English Analyzer), 抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高相关度的信号。匹配字段越多则越好
- 混合字段(Cross Field)
- 对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些列出的字段中找到尽可能多的词
Multi Match Query
- Best Fields 是默认类型,可以不用指定
- Minimum should match等参数可以传递到生成的query中
一个查询案例
- 英文分词器,导致精确度降低,时态信息丢失
使用多数字段匹配解决
- 用广度匹配字段 title 包括尽可能多的文档一以提升召回率一同时又 使用字段title.std 作为信号将相关度更高的文档置于结果顶部。
- 每个字段对于最终评分的贡献可以通过自定义值boost来控制。比如,使title字段更为重要,这样同时也降低了其他信号字段的作用:
跨字段搜索
- 无法使用Operator
- 可以用copy_to解决,但是需要额外的存储空间
可以使用:
- 支持使用 Operator
- 与copy_ to, 相比,其中一个优势就是它可以在搜索时为单个字段提升权重。
本节知识回顾
在这节当中我们学习了Multi Match的基础语法,通过Multi Match我们可以更好地去实现单字符串多字段的搜索,通过Multi Match我们还可以非常好的去控制搜索的persume 和 report,通过bosting的方式也可以对算分产生自己的控制。
CodeDemo
POST blogs/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ], "tie_breaker": 0.2 } } }
POST blogs/_search { "query": { "multi_match": { "type": "best_fields", "query": "Quick pets", "fields": ["title","body"], "tie_breaker": 0.2, "minimum_should_match": "20%" } } }
POST books/_search { "multi_match": { "query": "Quick brown fox", "fields": "*_title" } }
POST books/_search { "multi_match": { "query": "Quick brown fox", "fields": [ "*_title", "chapter_title^2" ] } }
DELETE /titles PUT /titles { "settings": { "number_of_shards": 1 }, "mappings": { "my_type": { "properties": { "title": { "type": "string", "analyzer": "english", "fields": { "std": { "type": "string", "analyzer": "standard" } } } } } } }
PUT /titles { "mappings": { "properties": { "title": { "type": "text", "analyzer": "english" } } } }
POST titles/_bulk { "index": { "_id": 1 }} { "title": "My dog barks" } { "index": { "_id": 2 }} { "title": "I see a lot of barking dogs on the road " }
GET titles/_search { "query": { "match": { "title": "barking dogs" } } }
DELETE /titles PUT /titles { "mappings": { "properties": { "title": { "type": "text", "analyzer": "english", "fields": {"std": {"type": "text","analyzer": "standard"}} } } } }
POST titles/_bulk { "index": { "_id": 1 }} { "title": "My dog barks" } { "index": { "_id": 2 }} { "title": "I see a lot of barking dogs on the road " }
GET /titles/_search { "query": { "multi_match": { "query": "barking dogs", "type": "most_fields", "fields": [ "title", "title.std" ] } } }
GET /titles/_search { "query": { "multi_match": { "query": "barking dogs", "type": "most_fields", "fields": [ "title^10", "title.std" ] } } }
相关阅读
总结
xxxxx
此文章为3月Day5学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》