ElasticSearch(es) multi_match查询

es中如果我们希望两个字段进行匹配,其中一个字段有这个文档就满足的话,使用multi_match。multi_match多匹配查询的类型有多种,其中的三种: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)。默认情况下,查询的类型是 best_fields ,这表示它会为每个字段生成一个match查询

参数

tie_breaker:在0~1之间,是个小数,在于说,将其他query的分数,乘以tie_breaker,然后综合与最高分数的那个query的分数,综合在一起进行计算,除了取最高分以外,还会考虑其他的query的分数。

minimum_should_match:最小匹配度,表示如果可选子句的数量等于(或小于)设置的值,则它们都是必需的,但如果它大于设置的值,则适用规范。

Best Fields模式

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

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": ["title", "content"],
      "type": "best_fields",
      "tie_breaker": 0.3,
      "minimum_should_match": "30%"
     }
  }
}

完全匹配"java""学习"的文档评分会比较靠前,如果只匹配“java”的文档评分乘以0.3的系数。我们希望完全匹配的文档占的评分比较高,则需要使用best_fields。

Most Fields模式

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": ["title", "content"],
      "type": "most_fields"
     }
  }
}

我们希望越多字段匹配的文档评分越高,就要使用most_fields

Cross Field模式

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": ["title", "content"],
      "type": "cross_fields"
     }
  }
}

我们会希望这个词条的分词词汇是分配到不同字段中的,那么就使用cross_fields

多字段匹配

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": "*_title"
     }
  }
}

任何与模糊模式正则匹配的字段都会被包括在搜索条件中,例如可以使用以下方式同时匹配 book_title 、 chapter_title 和 section_title (书名、章名、节名)这三个字段。

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": [ "*_title", "book_title^2" ]
     }
  }
}

可以使用 ^ 字符语法为单个字段提升权重,在字段名称的末尾添加 ^boost ,其中 boost 是一个浮点数

book_title这个字段的boost值为2,而其他两个字段 chapter_title和section_title字段的默认boost值为 1 。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。