zoukankan      html  css  js  c++  java
  • Elasticsearch 不同的搜索类型之间的区别

    1、match   轻量级搜索

    1 GET /wymlib/_search
    2 
    3 {
    4   "query": {
    5     "match": {
    6        "title": "王阳明"
    7     }
    8   }
    9 }

    上面的查询匹配就会进行分词,比如"王阳明"会被ik分词器分为"王阳明" ,"阳明", "王","阳","明" 那么所有包含这些词中的一个或多个的文档就会被搜索出来。并且根据lucene的评分机制(TF/IDF)来进行评分。

    2、match_phrase   短语搜索

    1 GET   /wymlib/_search
    2 
    3 {
    4   "query": {
    5     "match_phrase": {
    6       "title": "王阳明"
    7     }
    8   }
    9 }

    match_phrase要求只匹配上"王阳明"这个短语,完全匹配可能比较严,我们会希望有个可调节因子,少匹配一个也满足,那就需要使用到slop

     1 {
     2   "query": {
     3     "match_phrase": {
     4         "title" : {
     5             "query" : "王阳明",
     6             "slop" : 1
     7         }
     8     }
     9   }
    10 }

    3、multi_match   多字段匹配

    如果我们希望两个或两个以上的字段进行匹配,其中一个字段能匹配上就满足的话,使用multi_match

     1 {
     2   "query": {
     3     "multi_match": {
     4       "query": "王阳明第三卷",
     5       "fields": [
     6         "title",
     7         "keywords",
     8         "author"
     9       ]
    10     }
    11   }
    12 }

    multi_match中有三种类型即: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)

    1) 我们希望完全匹配的文档占的评分比较高,则需要使用best_fields,multi_match默认是best_fields

     1 {
     2   "query": {
     3     "multi_match": {
     4       "query": "王阳明",
     5       "fields": [
     6         "title",
     7         "yearAlias"
     8       ],
     9       "minimum_should_match": "70%"
    10     }
    11   }
    12 }

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

    {
      "query": {
        "multi_match": {
          "query": "王阳明",
          "type": "most_fields",
          "fields": [
            "title",
            "keywords"
          ]
        }
      }
    }

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

     1 {
     2   "query": {
     3     "multi_match": {
     4       "query": "王阳明",
     5       "fields": [
     6         "title",
     7         "keywords"
     8       ],
     9       "type": "cross_fields"
    10     }
    11   },
    12   "highlight": {
    13     "fields": {
    14       "title": {
    15         "pre_tags": ["<a>" ],
    16         "post_tags": [ "</a>"]
    17       },
    18       "keywords": {
    19         "pre_tags": ["<b>" ],
    20         "post_tags": ["</b>" ]
    21       }
    22     }
    23   }
    24 }

    上面查询语句中,包含了高亮显示结果属性:highligt

    4、term 精确值查找

    1 {
    2   "query": {
    3     "term": {
    4       "title": "王阳明"
    5     }
    6   }
    7 }

    与match查询类似,但term是精确查找,代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇,但是 term 和 terms 是 必须包含(must contain) 操作,而不是必须精确相等(must equal exactly),当查询 jack 时,[jack] 和[jack,jone]两条数据都会被找到

  • 相关阅读:
    UIButton在Disabled状态下标题混乱的问题
    一个丝滑的全屏滑动返回手势
    HTTP协议
    UICollectionView集合视图的概念
    nginx常用命令
    nginx安装
    POI生成Excel
    Android上传文件至服务器
    String,StringBuffer与StringBuilder的区别??
    Https网站中的安全证书导入到java中的cacerts证书库
  • 原文地址:https://www.cnblogs.com/hoojjack/p/8600230.html
Copyright © 2011-2022 走看看