elasticsearch:近似匹配、短语匹配及优化——笔记

版权声明:很多博客都参考或者直接转载自网络,如不方便转载,请联系我 https://blog.csdn.net/ma15732625261/article/details/79512250

短语匹配:

phrase match:多个term作为一个单位,作为搜索条件

GET /forum/article/_search
{
  "query": {
    "match_phrase": {
      "title":{ 
        "query": "java spark",
        "slop":3

      }
    }
  }
}

slop:term的移动次数,可反向移(内部机制吧)
关键词靠的越近打分越高——近似匹配proximity_match
    召回率比较低,要求精确度

分词后的position

GET _analyze
{
  "text":"hello world ,java spark",
  "analyzer":"standard"
}

match和phrase match(proximity match)区别

match
只要简单的匹配到了一个term,就可以将term对应的doc作为结果返回,扫描倒排索引,扫描到了就ok

phrase match
首先扫描到所有term的doc list; 找到包含所有term的doc list; 然后对每个doc都计算每个term的position,是否符合指定的范围; slop,需要进行复杂的运算,来判断能否通过slop移动,匹配一个doc

match query的性能比phrase match和proximity match(有slop)要高很多。
因为后两者都要计算position的距离:
match query比phrase match的性能要高10倍,比proximity match的性能要高20倍。

优化

用match query先过滤出需要的数据,然后再用proximity match或短语匹配来根据term距离提高doc的分数,同匹配只针对每个shard的分数排名前n个doc起作用,来重新调整它们的分数,这个过程称之为rescoring,重计分。
如下:先用match在提取前50个结果再次进行proximity match

GET /forum/article/_search
{
  "query": {
    "match": {
      "content": "java spark"
    }
  },
  "rescore":{
    "window_size":50,
    "query":{
      "rescore_query":{
        "match_phrase":{
          "content":{
            "query":"java spark",
            "slop":50
          }
        }
      }
    }
  }
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页