【Elasticsearch】Elasticsearch高手進階篇

160 阅读4分钟

以下內容,都是來自於Bilibili視頻。

图片.png

1. Term Filter

1.1 Create Data

寫法1:一次添加多個

POST /forum/_doc/_bulk
{ "index": { "_id": 1 }}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
{ "index": { "_id": 3 }}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }

寫法2:一個一個添加

PUT forum/_doc/1 
{ 
    "articleID" : "XHDK-A-1293-#fJ3", 
    "userID" : 1, 
    "hidden": false, 
    "postDate": "2017-01-01" 
}
PUT forum/_doc/2 
{ 
    "articleID" : "KDKE-B-9947-#kL5", 
    "userID" : 1, 
    "hidden": false, 
    "postDate": "2017-01-02" 
}

1.2 mapping

GET /forum/_mapping

{
  "forum" : {
    "mappings" : {
      "properties" : {
        "articleID" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "hidden" : {
          "type" : "boolean"
        },
        "postDate" : {
          "type" : "date"
        },
        "userID" : {
          "type" : "long"
        }
      }
    }
  }
}

ES5.2版本以後,type=text,默认会设置两个field,一个是field本身,比如articleID,就是分词的;还有一个的话,就是field.keyword,articleID.keyword,默认不分词,会最多保留256个字符

1.3 Query

GET /forum/_doc/_search
{
  "query" : {
    "constant_score" : { 
        "filter" : {
            "term" : { 
                "userID" : 1
            }
        }
    }
  }
}
GET /forum/_doc/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "term" : { 
                    "hidden" : false
                }
            }
        }
    }
}

GET /forum/_doc/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "term" : { 
                    "postDate" : "2017-01-01"
                }
            }
        }
    }
}

# 返回null,因為進行了分詞,匹配不到
GET /forum/_doc/_search
{
  "query" : {
      "constant_score" : { 
          "filter" : {
              "term" : { 
                  "articleID" : "XHDK-A-1293-#fJ3"
              }
          }
      }
  }
}

GET /forum/_doc/_search
{
  "query": {
    "match": {
      "articleID" : "XHDK-A-1293-#fJ3"
    }
  }
}

GET /forum/_doc/_search
{
  "query" : {
      "constant_score" : { 
          "filter" : {
              "term" : { 
                  "articleID.keyword" : "XHDK-A-1293-#fJ3"
              }
          }
      }
  }
}

2. Bool多組合filter

三個關鍵字:

  • must:必须匹配
  • should:可以匹配其中任意一个即可
  • must_not:必须不匹配

搜索发帖日期为2017-01-01,或者帖子ID为XHDK-A-1293-#fJ3的帖子,同时要求帖子的发帖日期绝对不为2017-01-02

GET /forum/_doc/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "should": [
            {"term": { "postDate": "2017-01-01" }},
            {"term": {"articleID.keyword": "XHDK-A-1293-#fJ3"}}
          ],
          "must_not": {
            "term": {
              "postDate": "2017-01-02"
            }
          }
        }
      }
    }
  }
}

搜索帖子ID为XHDK-A-1293-#fJ3,或者是帖子ID为JODL-X-1937-#pV7而且发帖日期为2017-01-01的帖子

GET /forum/_doc/_search 
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "should": [
            {
              "term": {
                "articleID.keyword": "XHDK-A-1293-#fJ3"
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "term":{
                      "articleID.keyword": "JODL-X-1937-#pV7"
                    }
                  },
                  {
                    "term": {
                      "postDate": "2017-01-01"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

3. 添加屬性/修改屬性

3.1 Add tag

POST /forum/_doc/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"tag" : ["java", "hadoop"]} }
{ "update": { "_id": "2"} }
{ "doc" : {"tag" : ["java"]} }
{ "update": { "_id": "3"} }
{ "doc" : {"tag" : ["hadoop"]} }
{ "update": { "_id": "4"} }
{ "doc" : {"tag" : ["java", "elasticsearch"]} }

4. Range範圍過濾

对于数字和日期类型的字段,range查询支持使用gt(大于)和lt(小于)操作符来指定范围的上限和下限

  • gte表示大于等于
  • lte表示小于等于
  • gt表示大于
  • lt表示小于
  • boost是用来提高查询的重要性,可以设置一个浮点数。
  • format是用来设置日期格式,如果要查询日期类型的字段,可以设置这个参数。
  • time_zone是用来设置时区。
POST /forum/_doc/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"view_cnt" : 30} }
{ "update": { "_id": "2"} }
{ "doc" : {"view_cnt" : 50} }
{ "update": { "_id": "3"} }
{ "doc" : {"view_cnt" : 100} }
{ "update": { "_id": "4"} }
{ "doc" : {"view_cnt" : 80} }
GET /forum/_doc/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "view_cnt": {
            "gt": 30,
            "lt": 60
          }
        }
      }
    }
  }
}

5. Match Query

添加數據

POST /forum/_doc/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"title" : "this is java and elasticsearch blog"} }
{ "update": { "_id": "2"} }
{ "doc" : {"title" : "this is java blog"} }
{ "update": { "_id": "3"} }
{ "doc" : {"title" : "this is elasticsearch blog"} }
{ "update": { "_id": "4"} }
{ "doc" : {"title" : "this is java, elasticsearch, hadoop blog"} }
{ "update": { "_id": "5"} }
{ "doc" : {"title" : "this is spark blog"} }

5.1 Or

GET /forum/_doc/_search
{
  "query": {
    "match": {
      "title": "java elasticsearch"
    }
  }
}

5.2 And

GET /forum/_doc/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch",
        "operator": "and"
      }
    }
  }
}

5.3 至少

GET /forum/_doc/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch spark hadoop",
        "minimum_should_match": "75%"
      }
    }
  }
}

5.4 多條件

GET /forum/_doc/_search
{
  "query": {
    "bool": {
      "must": { "match": { "title": "java" }},
      "must_not": { "match": { "title": "spark"  }},
      "should": [
        { "match": { "title": "hadoop" }},
        { "match": { "title": "elasticsearch"}}
      ]
    }
  }
}

6. 多種方法實現

普通match如何转换为term+should

{
  "match": { "title": "java elasticsearch"}
}

{
  "bool": {
    "should": [
      { "term": { "title": "java" }},
      { "term": { "title": "elasticsearch"   }}
    ]
  }
}

and match如何转换为term+must

{
    "match": {
        "title": {
            "query":    "java elasticsearch",
            "operator": "and"
        }
    }
}

{
  "bool": {
    "must": [
      { "term": { "title": "java" }},
      { "term": { "title": "elasticsearch"   }}
    ]
  }
}

minimum_should_match如何转换

{
    "match": {
        "title": {
            "query":                "java elasticsearch hadoop spark",
            "minimum_should_match": "75%"
        }
    }
}

{
  "bool": {
    "should": [
      { "term": { "title": "java" }},
      { "term": { "title": "elasticsearch"   }},
      { "term": { "title": "hadoop" }},
      { "term": { "title": "spark" }}
    ],
    "minimum_should_match": 3 
  }
}

7. 多字段搜索dis_max

POST /forum/_doc/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"content" : "i like to write best elasticsearch article"} }
{ "update": { "_id": "2"} }
{ "doc" : {"content" : "i think java is the best programming language"} }
{ "update": { "_id": "3"} }
{ "doc" : {"content" : "i am only an elasticsearch beginner"} }
{ "update": { "_id": "4"} }
{ "doc" : {"content" : "elasticsearch and hadoop are all very good solution, i am a beginner"} }
{ "update": { "_id": "5"} }
{ "doc" : {"content" : "spark is best big data solution based on scala ,an programming language similar to java"} }

搜索title或content中包含java beginner的帖子

GET /forum/_doc/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "java solution" }},
        { "match": { "content":  "java solution" }}
      ]
    }
  }
}

搜索title或content中包含java beginner的帖子,分數高的放前面

GET /forum/_doc/_search
{
  "query": {
    "dis_max": {
      "queries": [
        { "match": { "title": "java solution" }},
        { "match": { "content":  "java solution" }}
      ]
    }
  }
}