美文网首页
单字符串串多字段查询: Multi Match

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

作者: 滴流乱转的小胖子 | 来源:发表于2020-08-05 21:16 被阅读0次

一、最佳字段 (Best Fields)

当字段之间相互竞争,⼜又相互关联。例例如 title 和 body 这样的字段。评分来⾃自最匹配字段

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" ]
    }
}
  • Best Fields 是默认类型,可以不不⽤用指定
  • Minimum should match 等参数可以传
    递到⽣生成的 query中

二、多数字段 (Most Fields)

处理英⽂内容时:⼀种常见的手段是,在主字段( English Analyzer),抽取词干(去掉单复数、时态变化),加入同义词,以匹配更多的⽂文档。
相同的文本,加⼊⼦字段(Standard Analyzer),以提供更加精确的匹配。
其他字段作为匹配文档提⾼相关度的信号。匹配字段越多则越好

一个小例子 英⽂文分词器器,导致精确度降低,时态信息丢失

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"
    }
  }
}
image.png

将最短匹配的term,返回

使用多数字段匹配解决

  • ⽤用⼴广度匹配字段 title 包括尽可能多的⽂文档——以提
    升召回率——同时⼜又使⽤用字段 title.std 作为信号 将
    相关度更更⾼高的⽂文档置于结果顶部。
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" ]
        }
    }
}
  • 每个字段对于最终评分的贡献可以通过⾃自定义
    值 boost 来控制。⽐比如,使 title 字段更更为重要,
    这样同时也降低了了其他信号字段的作⽤用
    提升个别字段
    个别字段可以通过caret语法()进行提升:仅需要在字段名后添加boost,其中的boost是一个浮点数

GET /titles/_search
{
   "query": {
        "multi_match": {
            "query":  "barking dogs",
            "type":   "most_fields",
            "fields": [ "title^10", "title.std" ]
        }
    }
}

三、混合字段 (Cross Field)

对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体
的一部分。希望在任何这些列出的字段中找到尽可能多的词

跨字段搜索

  • 无法使用Operator
  • 可以用copy_to解决,但是需要额外的存储空间


    image.png

使用Cross Field 解决

image.png
  • 支持使用Operator
  • 与 copy_to, 相⽐比,其中⼀一个优势就是它可以在搜索时为单个字段提升权重

相关文章

网友评论

      本文标题:单字符串串多字段查询: Multi Match

      本文链接:https://www.haomeiwen.com/subject/haptrktx.html