• elasticsearch搜索引擎的常用方法


    1、term和terms
    term和terms等查询,不会对查询对字段进行分词处理,适合于date、num、id等确切数据进行搜索

    如果需要查询keywords,则查询等keywords必须是查询字段中可以分出来的词,如果不是,则无法查询到数据。

    例如:age字段包含的值为80后、90后。使用term查询,{"term":{"age":"80后"}} 这样是无法查询到age是"80后"的数据的,因为term不会对"80后"进行分词,而es中存储的age字段,会把"80后"分成“80”和“后”,没有“80后”,所以使用term无法查询到

    term查询某一个关键词的数据:
     

    # 查询content含有“学习”关键词的数据
     
    GET index_1/_search
     
    {
      "query": {
        "bool": {
          "filter": {
            "term": {
              "content": "学习"
            }
          }
        }
      }
    }
     
    

      

    terms查询某些关键词的数据:
    
    # 查询content中含有“学习”和“生活”的数据
     
    GET index_1/_search
     
    {
      "query": {
        "bool": {
          "filter": {
            "terms": {
              "content": [
                "学习",
                "生活"
              ]
            }
          }
        }
      }
    }
     
    

      

    2、match
    match的所有方法,都会对字段进行分词,所查询的字段数据只要包含分词后结果的一个,就会被查询到

    例如:age的数据包含有80后、90后,使用 {"match":{"age":"80后"}} 查询,会把所有的数据都查询出来。

    分析:match会把“80后”分词为“80”和“后”,而es也会讲age分词为“80“、“后”,“90”、“后”,所有数据都包含”后“,所以会被全部查找出来

    match查找age是80后的字段:
     

    GET index_1/_search
     
    {
      "query": {
        "bool": {
          "filter": {
            "match": {
              "age": "80后"
            }
          }
        }
      }
    }
     
     
    结果:
    {
      "took": 4,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "hits": {
        "total": 6433,
        "max_score": 0,
        "hits": [
          {
            "_index": "index_1",
            "_type": "type_1",
            "_id": "1",
            "_score": 0,
            "_source": {
              "age": "70后"
              ...}
          },
          {
            "_index": "index_1",
            "_type": "type_1",
            "_id": "2",
            "_score": 0,
            "_source": {
              "age": "80后"
              ...}
          },
          {
            "_index": "index_1",
            "_type": "type_1",
            "_id": "2",
            "_score": 0,
            "_source": {
              "age": "90后"
              ...}
          }
        ]
      }
    }
     
    

      

    match_phrase:短语匹配查询,必须匹配短语中的所有分词,并且保证各个分词的相对位置不变

    例如:age的数据包含有80后、90后,使用 {"match_phrase":{"age":"80后"}} 查询,只会把age字段是“80后”的数据查询出来。

    分析:match_phrase会把“80后”分词为“80”和“后”,而es也会讲age分词为“80“、“后”,“90”、“后”,查询的时候,只会查询“80”后面的分词是“后”的数据

    match_phrase查找age是80后的字段:
     

    GET index_1/_search
     
    {
      "query": {
        "bool": {
          "filter": {
            "match_phrase": {
              "age": "80后"
            }
          }
        }
      }
    }
     
     
    结果:
    {
      "took": 4,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "hits": {
        "total": 6433,
        "max_score": 0,
        "hits": [
          {
            "_index": "index_1",
            "_type": "type_1",
            "_id": "1",
            "_score": 0,
            "_source": {
              "age": "80后"
              ...}
          },
          {
            "_index": "index_1",
            "_type": "type_1",
            "_id": "2",
            "_score": 0,
            "_source": {
              "age": "80后"
              ...}
          },
          {
            "_index": "index_1",
            "_type": "type_1",
            "_id": "2",
            "_score": 0,
            "_source": {
              "age": "80后"
              ...}
          }
        ]
      }
    }
     
    

      

    multi_match:查询多个字段包含某个关键词的数据

    # 查询content或education中含有"大学"的数据
     
    GET index_1/_search
     
    {
      "query": {
        "bool": {
          "filter": {
            "multi_match": {
              "query": "大学",
              "fields": ["content", "education"]
            }
          }
        }
      }
    }
     
    

      

    match_all:查询所有文档

    GET index_1/_search
     
    {
      "query": {
        "match_all": {}
      }
    }
    

      

    3、range

    range范围查找,查找某一范围的所有数据

    gt:大于

    gte:大于等于

    lt:小于

    lte:小于等于

    # 查询时间大于等于2019-08-10 10:08:29,小于等于2019-08-13 10:08:29的数据
     
    GET index_4/_search
     
    {
      "query": {
        "bool": {
          "filter": {
            "range": {
              "date": {
                "gte": "2019-08-10 10:08:29", 
                "lte": "2019-08-13 10:08:29"
              }    
            }
          }
        }
      }
    }
     
    

      

    4、sort

    sort按照某些字段对数据进行排序,可以是一个字段,也可以是多个字段

    desc:降序

    asc:生序

    # 查询数据按照时间的降序排列
     
    GET index_1/_search
     
    {
      "sort": [
        {
          "date": {
            "order": "desc"
          }
        }
      ], 
      "query": {
        "match_all": {}
      }
    }
     
    

      

    5、_source

    对于搜索的结果,只关注某些字段的值

    # 查询所有的数据的name和age
     
    GET index_1/_search
     
    {
      "_source": ["name", "age"], 
      "query": {
        "match_all": {}
      }
    }
    

      

    6、from和size

    from:从某个位置开始查询,最小为0,某些情况下可以为-1(下一篇说明)

    size:查询长度

    from+size不能大于10000,否则es会报错(下一篇解决)

    # 查询前20条数据,并按照date的降序排列
     
    GET index_1/_search
     
    {
      "from": 0,
      "size": 20, 
      "sort": [
        {
          "date": {
            "order": "desc"
          }
        }
      ], 
      "query": {
        "match_all": {}
      }
    }
     
    

      

    7、fuzzy
    模糊匹配

    value:查询包含某关键字

    boost:增加查询的权值,默认值是1.0,必须于value同用,涉及字段_score(es默认按照_score排序)

    fuzziness:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等

    prefix_length:公共前缀长度,默认为0

    max_expansions:指定可被扩大到的最大词条数,默认为无限制
     

    GET index_4/_search
     
    {
      "query": {
       "fuzzy": {
         "type": {
           "value": "分期", 
           "boost": 0.5
         }
       }
      }
    }
    

      

    8、wildcard

    通配符查询

    *:匹配0或多个字符

    ?:匹配任意字符

    注意:使用wildcard的字段类型需要是keyword,切不分词;尽量少用,效率较低

    GET index_1/_search
     
    {
      "query": {
        "wildcard": {
          "content": {
            "value": "*学习*"
          }
        }
      }
    }
    

     采自于 https://blog.csdn.net/Misaki_root/article/details/101203647?spm=1001.2014.3001.5501

  • 相关阅读:
    第一篇日志
    Spring mvc 4系列教程(三)—— Spring4.X的新特性
    Spring mvc 4系列教程(二)——依赖管理(Dependency Management)和命名规范(Naming Conventions)
    Spring mvc 4系列教程(一)
    【管理心得之三十六】《黄帝内经》中的一句话
    【管理心得之三十五】好习惯也能惹“骂名”
    【管理心得之三十四】“禅宗境界”的员工
    【管理心得之三十三】管理者的“眉头”
    【管理心得之三十二】PMP杂谈---------爱情必胜术
    【管理心得之三十一】我的位置
  • 原文地址:https://www.cnblogs.com/it1042290135/p/14602831.html
Copyright © 2020-2023  润新知