27 - 单字符串多字段查询:Multi Match

查询的三种场景

  • 最佳字段(Best Fields)
    • 当字段之间互相竞争,又相互关联。例如title和body这样的字段。评分来自最匹配字段
  • 多数字段(Most Fields)
    • 处理英文内容时:一种常见的手段是,在主字段(English Analyzer),抽取词语,加入同义词。以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高相关度的信号。匹配字段越多则越好
  • 混合字段(Cross Field)
    • 对于某些实体,例如人命,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些词列出的字段中找到尽可能多的词

Multi Match Query

  • Best Fields是默认类型,可以不用指定
  • minimum should match等参数可以传递到生成的query中
best fields
  • Demo
DELETE titles
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"
    }
  }
}

仅匹配到id2的文档,下面经过multi match怎么修改

# 优化
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",
      "fields": ["title", "title.std"]
    }
  }
}

使用多数字段匹配解决问题

  • 用广度匹配的字段title包括尽可能多的文档:以提升召回率。同时又使用字段title.std做诶信号将相关度更好的文档置于结果顶部
  • 每个字段对于最终评分的贡献可以通过自定义值boost来控制。比如,使title字段更为重要,这样同时也降低了其他信号字段的作用
best fields

跨字段搜索

  • 无法使用Operator
  • 可以使用copy_to解决,但是需要额外的存储空间
most fields无法使用operator
cross fields
  • 支持使用Operator
  • 与copy_to相比,其中一个优势就是它可以在搜索时为单个字段提升权重
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容