Elasticsearch学习笔记二

96 阅读3分钟

对查询进行一些简单筛选

GET [index]/_search
{
  "query": {
    "match_all": {}
  },
  "size": 1,
  "from": 2,
  "_source": "value",
  "sort": {
    "value": {
      "order": "desc"
    }
  }
}

size 表示每一页总计数据条数,未指定时,默认值为10,from 表示从第几条数据开始看,0表示从第一条开始看。

如果要对查询结果进行排序处理,则需要用到 sort

当需要查询多个字段,可以使用 "_source": ["property", "value"] 来实现,当只查询某一个字段时,直接用 "_source": "value" 即可。

布尔查询

布尔查询是指使用布尔逻辑把基本查询组合成复杂查询("bool":表示条件,嵌套在"query"内部,表示查询内容需要满足的条件)。

"must":表示同时满足所有条件;

"should":表示只需满足其中一个条件即可;

"must_not":表示一个条件都不满足;

"match": 每一个条件用一个"match"单独表示。

GET [index]/_search
{
  "query":{
    "bool":{
      "must": [{
        "match":{
          "productId": "waterLevel"
        }
      }],
      "must_not":[{
        "match":{
          "deviceId": "waterLevel002"
        },
        "match":{
          "deviceId": "waterLevel003"
        }
      }]
    }
  }
}

范围查询

范围查询用 filter (过滤器)- range

gt,gte,lt,lte缩写的含义:【gt: greater than 大于】【gte: greater than or equal 大于等于】【lt: less than 小于】【lte: less than or equal 小于等于】。

GET [index]/_search
{
  "query":{
    "bool":{
      "must": [{
        "match":{
          "productId": "waterLevel"
        }
      }],
      "filter": {
        "range": {
          "value": {
            "gte": 0.2,
            "lte": 0.6
          }
        }
      }
    }
  }
}

分词

分词是将文本转换成一系列单词的过程,也可以叫文本分析,在ES里面称为Analysis。

Es 内置分词器

  • Standard Analyer 默认分词器,按词切分,小写处理
  • Simple Analyer 按照非字母切分(符号被过滤),小写处理
  • Stop Analyer 小写处理,停用过滤词(the, is , a)
  • Whitespace Analyer 按照空格切分,不转小写
  • Keyword Analyer 不分词,直接将输入当作输出
  • Pattern Analyer 正则表达式,默认 \W+(非字符分隔)
  • Language 提供30种分词器
  • Customer Analyzer 自定义分词器

以类型keyword还是text为例,通过执行GET [index],可以看到每个属性都有个type,值为keyword、text等。

如果类型为keyword,则说明字段的存储并未进行分词操作,一般这种用于需要精确检索的字段。

如果类型为text,则说明字段存储时进行了分词操作,一般这种用于需要模糊检索的字段。

term、match和match_phrase

term:完全匹配,也即是精确查询,通俗的说就是搜索前不会再对搜索词进行分词拆解,如果搜索好几类词的公共部分,则这些词都会被搜索出来。虽然term不会对搜索词进行分词,但是包含搜索词的所有部分都会被查出来,并不需要搜索词和原始录入词完全一致。term并不能通过"terms":{[,]}来进行对由多个词构成的词组查询,这种写法实际达成的是只要满足其中一个就被查询出来的效果,如果要多个词组组合查询需要用"bool"和"must"结合查询

match:match和term的区别在于match在进行搜索时,会先进行分词拆分,然后再进行匹配,故原始字段只要包含搜索词中的一个分词结果就行

match_phrase:如果为短语搜索,要求所有的分词必须同时出现在文档中,同时要求位置也一致

待续。。。。。。