同福

Elasticsearch全文匹配和搜索精度【20201018】

介绍

介绍

我们在使用Elasticsearch进行搜索的时候,会需要对搜索结果进行调整,以达到最佳效果。影响搜索结果的取决于索引和搜索分词的匹配度,低精度要求可以是只要一个搜索分词命中就算匹配到了,高精度要求可以是每一个搜索分词都命中才算匹配到了,甚至可以要求索引必须一字不差地包含搜索关键字才算匹配到了。

福哥今天带着大家来了解一下ES的匹配模式的知识吧。我们今天只谈匹配问题,不讲排序问题,所以童鞋们可以不用考虑搜索结果记录之间的匹配度高低问题了。

match(全文匹配)

这种方式就是根据默认规则进行匹配,并根据默认权重进行排序的

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": {
        "match": {
          "userName": "福哥"
        }
      }
    }
  }
}

minimum_should_match(匹配度)

分词个数匹配度

设置最小匹配度为1,表示只要有一个分词命中就匹配出来

如果匹配度数字设置过大,会出现大量查询不到结果的情况

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": {
        "match": {
          "userName": {
            "query":"福哥",
            "minimum_should_match": 1
          }
        }
      }
    }
  }
}

百分比匹配度

设置最小匹配度为50%,表示只要有一半的分词命中就匹配出来

如果匹配百分比设置接近100%,会出现大量查询不到结果的情况

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": {
        "match": {
          "userName": {
            "query":"福哥",
            "minimum_should_match": "50%"
          }
        }
      }
    }
  }
}

组合匹配度

设置组合匹配度3<80%,这个有点复杂,分两种情况

如果不高于下限(3)则下限(3)和上限(80%)都要判断

如果高于下限(3)则只有上限(80%)会被判断

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": {
        "match": {
          "userName": {
            "query":"福哥",
            "minimum_should_match": "3<80%"
          }
        }
      }
    }
  }
}

match_phrase(精确匹配)

这种方式就是需要查询字符串完全在目标字符串当中才行,类似SQL的(like '%福哥%')意思

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": {
        "match_pharse": {
          "userName": "福哥"
        }
      }
    }
  }
}

总结

福哥整理了一些关于使用Elasticsearch的搜索技巧,后面福哥会不断精进关于ES的搜索技巧的内容,大家可以持续关注“同福编程”。