1. 程式人生 > >Elasticsearch 增刪改查(CRUD)參考例子

Elasticsearch 增刪改查(CRUD)參考例子

##索引資料,插入3條。

PUT /megacorp/employee/1

{

    "first_name" : "John",

    "last_name" :  "Smith",

    "age" :        25,

    "about" :      "I love to go rock climbing",

    "interests": [ "sports", "music" ]

}

PUT /megacorp/employee/2

{

    "first_name" :  "Jane",

    "last_name" :   "Smith",

    "age" :         32,

    "about" :       "I like to collect rock albums",

    "interests":  [ "music" ]

}

##version 處理衝突,當併發更新資料時防止更新丟失。

PUT /megacorp/employee/3?version=1 

{

    "first_name" :  "Douglas",

    "last_name" :   "Fir",

    "age" :         35,

    "about":        "I like to build cabinets",

    "interests":  [ "forestry" ]

}

##查詢資料

GET /megacorp/employee/1

##查詢所有資料,預設返回前十條

GET /megacorp/employee/_search

{

  "query": {

    "match_all": {}

  }

}

##更新

1、重新索引,直接執行上邊的插入資料即可

2、區域性更新,存在的欄位覆蓋,不存在的欄位新增

POST /megacorp/employee/1/_update?retry_on_conflict=5

{

   "doc" : {

      "interests" : [ "movie","music" ],

      "age": 26

   }

}

##刪除

DELETE    /megacorp/employee/1

##批量查詢(讀)

1、索引型別隨意定義

POST /_mget

{

   "docs" : [

      {

         "_index" : "megacorp",

         "_type" :  "employee",

         "_id" :    1

      },

      {

         "_index" : "megacorp",

         "_type" :  "employee",

         "_id" :    2,

         "_source": ["interests","age"]

      }

   ]

}

2、索引型別都一致,省事寫法

POST /megacorp/employee/_mget

{

   "ids" : [ "2", "1" ]

}

3、大部分索引型別一樣,偷懶寫法。很自由

POST /megacorp/employee/_mget

{

   "docs" : [

      { "_id" : 2 },

       {

         "_index" : "website",

         "_type" :  "blog",

         "_id" :    123

      }

   ]

}

##批量寫

POST /_bulk

{"create":{"_index":"website","_type":"blog","_id":"123"}}

{"title":"My first blog post","author":"Lidonghai"}

{"index":{"_index":"website","_type":"blog","_id":"124"}}

{"title":"My second blog post","author":"Liefu"}

{"update":{"_index":"website","_type":"blog","_id":"123","_retry_on_conflict":3}}

{"doc":{"title":"My updated blog post","author":"Liening"}}

{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}

##更靈活的多索引多型別定義查詢。這個好玩

/_search

在所有索引的所有型別中搜索

/gb/_search

在索引gb的所有型別中搜索

/gb,us/_search

在索引gbus的所有型別中搜索

/g*,u*/_search

在以gu開頭的索引的所有型別中搜索

/gb/user/_search

在索引gb的型別user中搜索

/gb,us/user,tweet/_search

在索引gbus的型別為usertweet中搜索

/_all/user,tweet/_search

示例一:

GET /megacor*,websit*/_search

{

    "query": {

        "match": {

            "_all": "Liening rock"

        }

    }

}

##示例二,無比靈活。型別中可以沒有相應的欄位都可以誇索引進行查詢

GET /megacor*,websit*/_search

{

  "from":0,

  "size":10,

  "query": {

    "bool": {

      "must":     { "match": { "last_name": "Smith" }},

      "must_not": { "match": { "first_name": "Jane"  }},

      "should": [

                  { "match": { "interests": "sports" }},

                  { "match": { "author": "Liefu"   }}

      ]

    }

  }

}

##其它有意思的查詢

1、term過濾,過濾準確值

GET /megacorp/employee/_search

{

  "query": {

    "term": {

      "age": 32

    }

  }

}

##常用的boost屬性

GET /megacorp/employee/_search

{

  "query": {

    "term": {

      "age": {

        "value": 32,

        "boost": 10.0

      }

    }

  }

}

2、terms過濾,過濾多個準確值

GET /megacorp/employee/_search

{

  "query": {

    "terms": {

      "about": ["rock","albums"]

    }

  }

}

3、range過濾

GET /megacorp/employee/_search

{

  "query": {

    "range": {

      "age": {

        "gte": 20,

        "lt": 30

      }

    }

  }

}

4、bool過濾。注意 term型別過濾,過濾的term是被分析器處理過的,別踩坑

GET /megacorp/employee/_search

{

  "query": {

    "bool": {

      "must": {

        "term": {

          "last_name": "smith"

        }

      },

      "must_not": {

        "range": {

          "age": {

            "gte": 50,

            "lt": 100

          }

        }

      },

      "should": [

        {

          "term": {

            "about": "albums"

          }

        },

        {

          "term": {

            "about": "rock"

          }

        }

      ]

    }

  }

}

5、match匹配查詢,先用該欄位上的分詞器進行分詞獲取term,之後再去欄位上進行匹配term,有則符合無責排除,多則分高少則分低。

GET /megacorp/employee/_search

{

  "query": {

    "match": {

      "about": "rock climbing"

    }

  }

}

##提高下精度

GET /megacorp/employee/_search

{

  "query": {

    "match": {

      "about": {      

                "query":    "rock climbing",

                "operator": "and"

            }

    }

  }

}

##控制精度

GET /megacorp/employee/_search

{

  "query": {

    "match": {

      "about": {      

                "query":    "rock climbing love",

                 "minimum_should_match": "75%"

            }

    }

  }

}

6、多欄位搜尋,多個欄位同時搜尋term(經分析器分後),有則符合多則分高。此處不涉及具體評分規則

GET /megacorp/employee/_search

{

  "query": {

     "multi_match": {

        "query":    "run climbing",

        "fields":   [ "interests", "about" ]

    }

  }

}

7bool查詢

bool 查詢與 bool過濾相似,用於合併多個查詢子句。不同的是,bool過濾可以直接給出是否匹配成功, 而bool查詢要計算每一個查詢子句的_score(相關性分值)。

must:: 查詢指定文件一定要被包含。

must_not:: 查詢指定文件一定不要被包含。

should:: 查詢指定文件,有則可以為文件相關性加分。

GET /megacorp/employee/_search

{

  "from": 0,

  "size": 10,

  "query": {

    "bool": {

      "must": {

        "match": {

          "last_name": "Smith"

        }

      },

      "must_not": {

        "match": {

          "first_name": "Jane"

        }

      },

      "should": [

        {

          "match": {

            "interests": "sports"

          }

        },

        {

          "match": {

            "interests": "Liefu"

          }

        }

      ]

    }

  }

}

##控制精度,同樣適用於bool過濾喲

GET /megacorp/employee/_search

{

  "query": {

    "bool": {

      "should": [

        { "match": { "about": "rock" }},

        { "match": { "about": "climbing"   }},

        { "match": { "about": "albums"   }}

      ],

      "minimum_should_match": 2

    }

  }

}

8、先查詢在過濾,多個查詢條件也很簡單

GET /megacorp/employee/_search

{

  "query": {

    "filtered": {

      "query": {

        "match_all": {}

      },

      "filter": {

        "term": {

          "last_name": "smith"

        }

      }

    }

  }

}

##多個查詢條件

GET /megacorp/employee/_search

{

  "query": {

    "filtered": {

      "query": {

        "bool": {

          "must": [

            {

              "match": {

                "last_name": "Smith"

              }

            },

            {

             "match": {

                "about": "rock"

              }

            }

          ]

        }

      },

      "filter": {

        "term": {

          "first_name": "john"

        }

      }

    }

  }

}

9、先過濾再查詢,指定多個過濾條件也很簡單。

GET /megacorp/employee/_search

{

  "query": {

    "filtered": {

      "filter": {

        "bool": {

          "must": {

            "term": {

              "last_name": "smith"

            }

          },

          "must_not": {

            "query": {

              "match": {

                "first_name": "John"

              }

            }

          }

        }

      }

    }

  }

}

##多個過濾條件

GET /megacorp/employee/_search

{

  "query": {

    "filtered": {

      "filter": {

        "bool": {

          "must": [

            {

              "term": {

                "last_name": "smith"

              }

            },

            {

              "term": {

                "about": "rock"

              }

            }

          ],

          "must_not": {

            "query": {

              "match": {

                "first_name": "John"

              }

            }

          }

        }

      }

    }

  }

}

10、驗證查詢,不得不承認開始的時候是比較難寫上述的語句。所以驗證查詢也是很有用的,幫我們檢視到底我們的語句是否書寫正確否。如果有問題就檢視下錯誤原因

GET /megacorp/employee/_validate/query?explain

{

  "query": {

    "match_all": {}

  }

}

##沒問題

##有問題看下啥原因引起的錯誤

GET /megacorp/employee/_validate/query?explain

{

  "query": {

    "match_all": {}

  }

}

11、exists過濾器,某個欄位不為空,類似於SQLis not null。不想要查詢結果傳引數?search_type=count。可以用來判斷某個欄位是否存在,如果返回條數為0則說明這個欄位不存在。

GET  /megacorp/employee/_search

{

    "query" : {

        "filtered" : {

            "filter" : {

                "exists" : { "field" : "first_name" }

            }

        }

    }

}

12、missing過濾器,某個欄位為空,類似於SQLis null.不想要查詢結果傳引數?search_type=count

GET /megacorp/employee/_search

{

  "query": {

    "filtered": {

      "filter": {

        "missing": {

          "field": "first_name"

        }

      }

    }

  }

}

13、控制得分,對比下方的兩種查詢文件的得分。是不是改變了得分。

##預設得分

GET /megacorp/employee/_search

{

  "query": {

    "bool": {

      "should": [

        {

          "match": {

            "about": "rock"

          }

        },

        {

          "match": {

            "about": "climbing"

          }

        },

        {

          "match": {

            "about": "albums"

          }

        }

      ],

      "minimum_should_match": 2

    }

  }

}

##改變了子句權重

GET /megacorp/employee/_search

{

  "query": {

    "bool": {

      "should": [

        {

          "match": {

            "about": "rock"

          }

        },

        {

          "match": {

            "about": {

              "query": "climbing",

              "boost": 2

            }

          }

        },

        {

          "match": {

            "about": "albums"

          }

        }

      ],

      "minimum_should_match": 2

    }

  }

}

########################################更高階的查詢#####################

1、最佳欄位查詢。一個欄位包含使用者輸入的所有詞比多個欄位分別包含使用者的部分詞更相關。

PUT /my_index/my_type/5

{

    "title": "Quick brown rabbits",

    "body":  "Brown rabbits are commonly seen."

}

PUT /my_index/my_type/6

{

    "title": "Keeping pets healthy",

    "body":  "My quick brown fox eats rabbits on a regular basis."

}

GET  /my_index/my_type/_search

{

    "query": {

        "bool": {

            "should": [

                { "match": { "title": "Brown fox" }},

                { "match": { "body":  "Brown fox" }}

            ]

        }

    }

}

GET  /my_index/my_type/_search

{

    "query": {

        "dis_max": {

            "queries": [

                { "match": { "title": "Brown fox" }},

                { "match": { "body":  "Brown fox" }}

            ]

        }

    }

}

##最佳欄位查詢調優,這個是彌補dis_max使用最高得分排序的不足彌補(可能都不能同時包含所有term,這時就需要將其他欄位的分數算上點,這樣結果就更相關點)

GET  /my_index/my_type/_search

{

    "query": {

        "dis_max": {

            "queries": [

                { "match": { "title": "Quick pets" }},

                { "match": { "body":  "Quick pets" }}

            ],

            "tie_breaker": 0.3

        }

    }

}

GET /my_index/my_type/_search

{

  "query": {

  "dis_max": {

    "queries":  [

      {

        "match": {

          "title": {

            "query": "Quick brown fox",

            "minimum_should_match": "30%"

          }

        }

      },

      {

        "match": {

          "body": {

            "query": "Quick brown fox",

            "minimum_should_match": "30%"

          }

        }

      }

    ],

    "tie_breaker": 0.3

  }

}

}

2、多重查詢(多個欄位中執行相同查詢)

##最佳欄位查詢簡寫

GET /my_index/my_type/_search

{

  "query": {

 "multi_match": {

        "query":                "Quick brown fox",

        "type":                 "best_fields",

        "fields":               [ "title", "body" ],

        "tie_breaker":          0.3,

        "minimum_should_match": "30%"

    }

  }

}

##最佳欄位查詢,欄位萬用字元

GET /my_index/my_type/_search

{

  "query": {

    "multi_match": {

      "query": "Quick brown fox",

      "fields": "*title"

    }

  }

}

##最佳欄位查詢,欄位加權

GET /my_index/my_type/_search

{

  "query": {

    "multi_match": {

      "query": "Quick brown fox",

      "fields": [

        "*title^2",

        "*body"

      ]

    }

  }

}

3、最多欄位查詢,在多數字段中匹配到比在少數字段中匹配到更相關,就是bool匹配的簡寫方式(should子句匹配數量多越相關)。利用這個特性將同一欄位以不同分析器分析後索引多次可以提高搜尋相關性(比如不提取詞幹的分析器、提取詞幹的分析器、近義詞分析器等)。

PUT /my_index

{

    "settings": { "number_of_shards": 1 },

    "mappings": {

        "my_type": {

            "properties": {

                "title": {

                    "type":     "string",

                    "analyzer": "english",

                    "fields": {

                        "std":   {

                            "type":     "string",

                            "analyzer": "standard"

                        }

                    }

                }

            }

        }

    }

}

PUT /my_index/my_type/1

{ "title": "My rabbit jumps" }

PUT /my_index/my_type/2

{ "title": "Jumping jack rabbits" }

GET /my_index/_search

{

   "query": {

        "multi_match": {

            "query":  "jumping rabbits",

            "type":   "most_fields",

            "fields": [ "title", "title.std" ]

        }

    }

}

##加點權重

GET /my_index/_search

{

   "query": {

        "multi_match": {

            "query":       "jumping rabbits",

            "type":        "most_fields",

            "fields":      [ "title^10", "title.std" ]

        }

    }

}

4、跨欄位查詢,這個就厲害了

首先解釋下跨欄位查詢、最多欄位查詢的區別。因為兩者挺像的。為什麼有些情況最多欄位查詢不能替代跨欄位查詢。感性的理解跨欄位查詢,就是把多個欄位看做一個欄位然後match使用者的輸入字串。

定義:最多欄位查詢被設計用來找到匹配任意單詞的多數字段,跨欄位查詢是找到跨越所有欄位的最匹配的單詞。(一時蒙圈)

most_fields是以欄位為中心(Field-centric),而不是以詞條為中心(Term-centric)most_fields會查詢最多匹配的欄位(Most matching fields),而我們可能真正感興趣的是最匹配的詞條(Most matching terms)。因此最多欄位不能替換跨欄位查詢。

例子:找個例子體會下。

PUT /my_index1/my_type/2

{

    "street":   "5 Poland Street",

    "city":     "London",

    "country":  "United Kingdom",

    "postcode": "W1V 3DG"

}

PUT /my_index1/my_type/3

{

    "street":   "5 Poland",

    "city":     "Poland",

    "country":  "United Kingdom",

    "postcode": "W1V 3DG"

}

##最多欄位查詢

GET /my_index1/my_type/_search

{

  "query": {

    "multi_match": {

      "query":   "Poland Street",

      "type":    "most_fields",

      "fields":  [ "street", "city", "country", "postcode" ]

    }

  }

}

解釋:使用者輸入Poland Street,得出的查詢結果是在2個欄位中匹配相同單詞(Poland),比在1個欄位中匹配兩個單詞(Poland Street)的分數要高。顯然這不是使用者想要的結果。這就體現了最多欄位匹配(Most matching fields)的不足之處,就像上邊說的(最多欄位查詢被設計用來找到匹配任意單詞的多數字段),不是找到最佳的匹配單詞的。因此顯然不能替換跨欄位查詢。

##看一下排序的效果是不是,跨欄位查詢比最多欄位查詢更合適這種場景。下方給出了加權的測試,排序順序有變化了。

GET /my_index1/my_type/_search

{

  "query": {

    "multi_match": {

      "query":   "Poland Street",

      "type":    "cross_fields",

      "fields":  [ "street", "city", "country", "postcode" ]

    }

  }

}

GET /my_index1/my_type/_search

{

  "query": {

    "multi_match": {

      "query":   "Poland Street",

      "type":    "cross_fields",

      "fields":  [ "street", "city^5", "country", "postcode" ]

    }

  }

}

##檢視兩種查詢的查詢細節,如下。其中"operator": "and"項可以去掉,用and的目地就是加大兩種查詢的差異。更能清晰的體會到

GET /my_index1/my_type/_validate/query?explain

{

  "query": {

    "multi_match": {

      "query":   "Poland Street",

      "type":    "most_fields",

      "operator":    "and",

      "fields":  [ "street", "city", "country", "postcode" ]

    }

  }

}

GET /my_index1/my_type/_validate/query?explain

{

  "query": {

    "multi_match": {

      "query":   "Poland Street",

      "type":    "cross_fields",

      "operator":    "and",

      "fields":  [ "street", "city", "country", "postcode" ]

    }

  }

}

##跨欄位查詢的其他注意事項。可以自行測試,並用_validate驗看結果。

**為了讓cross_fields查詢型別能以最佳的方式工作,所有的欄位都需要使用相同的解析器。使用了相同的解析器的欄位才會被組合在一起形成混合欄位。如果你包含了使用不同分析器的欄位,它們會以和best_fields相同的方式被新增到查詢中。

**同樣將not_analyzed欄位混合到analyzed欄位中是沒有益處的。

**另外跨欄位查詢的另外一種替代方案就是“全欄位查詢”,可已將跨越的多個欄位內容放到一個欄位中存放。這樣就可以達到跨欄位查詢的效果。用那種方案更合適自己就選來用。

##全欄位查詢的使用方式如下。看下效果和跨欄位一樣。

PUT /my_index1

{

    "mappings": {

        "my_type": {

            "properties": {

                "street": {

                    "type":     "string",

                    "copy_to":  "full_name"

                },

                "city": {

                    "type":     "string",

                    "copy_to":  "full_name"

                },

                 "country": {

                    "type":     "string",

                    "copy_to":  "full_name"

                },

                 "postcode": {

                    "type":     "string",

                    "copy_to":  "full_name"

                },

                "full_column": {

                    "type":     "string"

                }

            }

        }

    }

}

##達到了跨欄位查詢的效果,所以自己選擇一種方案吧(跨欄位查詢、全欄位查詢)

GET /my_index1/my_type/_search

{

  "query": {

    "match": {

      "full_column": "Poland Street"

    }

  }

}

**這條補充下跨欄位查詢不能被最多欄位查詢替換的原因(最多欄位查詢存在的問題)

參看:https://es.xiaoleilu.com/110_Multi_Field_Search/40_Field_centric.html

它被設計用來找到匹配任意單詞的多數字段,而不是找到跨越所有欄位的最匹配的單詞。

它不能使用operator或者minimum_should_match引數來減少低相關度結果帶來的長尾效應。

每個欄位的詞條頻度是不同的,會互相干擾最終得到較差的排序結果。(涉及到打分)

########################其它常用的查詢################

##match_phrase查詢,短語匹配,預設分出的term必須同時包含在欄位中,並且各個term之間順序必須和查詢的順序相同

GET /megacorp/employee/_search

{

  "query": {

    "match_phrase": {

      "about": "rock albums"

    }

  }

}

GET /megacorp/employee/_search

{

  "query": {

    "match_phrase": {

      "about": {

        "query":"like albums",

        "slop":3  ##各個term必須出現在文件中,但是順序可以不一定按照查詢字串的順序。這個slop意思是需要移動多少次term才能匹配到相應的文件(或者說移動多少次term才能和文件中的term順序和位置一致)

      }

    }

  }

}

##match_phrase_prefix查詢,和match_phrase查詢很相近,只是最後一個詞項可以只寫一單詞的一部分就可以匹配出(可能考慮到使用者拼不完最後一個單詞,這個可能比match_phrase更好用點)

GET /megacorp/employee/_search

{

  "query": {

    "match_phrase_prefix": {

      "about": {

        "query":"build cabi"

      }

    }

  }

}

##query_string查詢。Elasticsearch支援Lucene的查詢語法。

就是簡化的bool查詢、DisMax查詢,效果依賴分詞器,中文用中文分詞器會好點

GET /megacorp/employee/_validate/query?explain

{

  "query": {

    "query_string": {

       "query": "-rock +climbing^3  like",  #+表示必須,-表示一定不,空表示有則加分

       "fields": ["about","last_name"],

       "minimum_should_match": "20%",  #控制匹配數量

"use_dis_max": true   ##使用DisMax查詢,去掉引數使用bool查詢

    }

  }

}

##ids查詢

GET /megacorp/employee/_search

{

  "query": {

    "ids": {

      "values": ["1","2","3"]

    }

  }

}

GET /megacorp/_search

{

  "query": {

    "ids": {

      "type":"employee",

      "values": ["1","2","3"]

    }

  }

}

##prefix查詢,字首查詢。找到欄位中含有以"coll"字首開頭的term的文件

GET /megacorp/_search

{

  "query": {

    "prefix": {

      "about":"coll"

    }

  }

}

##fuzzy查詢,模糊查詢,此類查詢特別費cpu,不建議使用。但在一些特殊場景下有用,

比如搜尋 like  時使用者寫成了lkie。也是可以搜尋出來的

GET /megacorp/employee/_search

{

  "query": {

    "fuzzy": {

      "about":{

      "value":"clbing"

      }

      }

  }

}

##wildcard查詢,野查詢,可以使用萬用字元

GET /megacorp/employee/_search

{

  "query": {

    "wildcard": {

      "about":{

      "value":"cl*?bing"

      }

      }

  }

}

##more_like_this查詢,和最多欄位查詢基本一樣。用處不大

GET /megacorp/employee/_search

{

  "query": {

    "more_like_this": {

      "fields":["about","last_name"],

      "like_text": "like collect smith",

      "min_term_freq": 1, ##term出現在文件中的頻率不能低於這個值

      "min_doc_freq": 1 ##term出現的文件數量不能少於這個值。

      }

  }

}

##指令碼過濾器

注:使用指令碼過濾器需要配置elasticsearch.yml才可以

vim elasticsearch.yml ##新增配置

script.engine.groovy.inline.update: on

script.search: on

script.groovy.sandbox.enabled: true

GET /megacorp/employee/_search

{

  "filter": {

    "script": {

      "script": "now - doc['age'].value > 0",

      "params": {

        "now": 100

      }

    }

  }

}

##type過濾器,當查詢結果有大量型別時比較有用

GET /megacorp/_search

{

  "filter": {

    "type": {

      "value":"employee"

    }

  }

}

##ids過濾器

GET /megacorp/_search

{

  "filter": {

    "ids": {

      "values":[1,2,3]

    }

  }

}

##not過濾器,not中指定的過濾器匹配到的記錄不會被返回

GET /megacorp/employee/_search

{

  "filter": {

    "not": {

      "filter": {

        "ids": {

          "values": [

            1,

            2,

            3

          ]

        }

      }

    }

  }

}

##or過濾器,匹配or過濾器陣列中任何一個過濾器都會返回

GET /megacorp/employee/_search

{

  "filter": {

    "or": [

      {

        "term": {

          "age": 36

        }

      },

            {

        "term": {

          "age": 27

        }

      }

    ]

  }

}

##and過濾器,匹配所有and陣列中的過濾器才可以返回

GET /megacorp/employee/_search

{

  "filter": {

    "and": [

      {

        "term": {

          "age": 27

        }

      },

            {

        "term": {

          "last_name": "smith"

        }

      }

    ]

  }

}

##andor過濾器,and中的過濾器和or中的任何一個顧慮器同時匹配到才可以

GET /megacorp/employee/_search

{

  "filter": {

    "and": [

      {

        "term": {

          "age": 36

        }

      },

      {

        "or": [

          {

            "term": {

              "first_name": "smith"

            }

          },

          {

            "term": {

              "last_name": "fir"

            }

          }

        ]

      }

    ]

  }

}

##notandor過濾器一起使用,not中的過濾器匹配到的都不能返回

GET /megacorp/employee/_search

{

  "filter": {

    "not": {

    "filter": {

    "and": [

      {

        "term": {

          "age": 36

        }

      },

      {

        "or": [

          {

            "term": {

              "first_name": "smith"

            }

          },

          {

            "term": {

              "last_name": "fir"

            }

          }

        ]

      }

    ]

  }

    }

  }

}

##boosting查詢,包括三個部分,positive(必須匹配並且分數不變)、negative(匹配到的文件要降分)、nagative_boost(降分的係數,當然也可以生分)。和之前調boost的方式差不多

GET /megacorp/_search

{

  "query": {

    "boosting": {

      "positive": {

        "term": {

          "about": "rock"

        }

      },

      "negative": {

        "term": {

          "age": 12

        }

      },

      "negative_boost": 0.2

    }

  }

}

##constant_score查詢,所有返回文件得分一樣

GET /megacorp/employee/_search

{

  "query": {

    "constant_score": {

      "query": {

        "term": {

          "about": "rock"

        }

      },

      "boost":2.0  ##這個引數沒效果

    }

  }

}

##indices查詢,多個索引進行查詢時有用(別名對應多個索引、或者萬用字元通配多個索引)時可以區分索引執行不同的查詢。indices陣列中匹配到的索引執行query,未匹配到的索引執行no_match_query

GET megacorptests/_search  ##megacorptests是兩個索引的別名

{

  "from":0,

  "size":100,

  "query": {

    "indices": {

      "indices": [

        "megacorp"    ##這個索引將會執行query查詢,其他的索引執行no_match_query

      ],

      "query": {

        "term": {

          "about": "build"

        }

      },

      "no_match_query": {

        "term": {

          "content2": "李克強"

        }

      }

    }

  }

}

###############補充部分#############

##script_fields查詢,對於查詢後的結果資料,該查詢可以定義只要某些欄位,並且還可以對這些欄位進行調整修改

GET /megacorp/employee/_search

{

  "script_fields": {

     "realage": {

      "script": "_source.age"

    },

    "fakeage": {

      "script": "doc['age'].value -8"

    },

    "about": {

      "script": "_source.about"

    }

  },

  "query": {

    "term": {

      "about": "rock"

    }

  }

}

##script_fields查詢傳引數

GET /megacorp/employee/_search

{

  "script_fields": {

     "realage": {

      "script": "_source.age"

    },

    "fakeage": {

      "script": "doc['age'].value -paramage"

      , "params": {"paramage":8}

    },

    "about": {

      "script": "_source.about"

    }

  },

  "query": {

    "term": {

      "about": "rock"

    }

  }

}

##定義返回的欄位

GET /megacorp/employee/_search

{

  "fields": ["about","first_name","last_name"],

  "query": {

    "term": {

      "about": "rock"

    }

  }

}

##min_score限制結果分數,低於0.1分不要了

GET /megacorp/employee/_search

{

  "min_score":0.1,

  "query": {

    "term": {

      "about": "rock"

    }

  }

}

##version返回版本號

GET /megacorp/employee/_search

{

  "version": true,

  "query": {

    "term": {

      "about": "rock"

    }

  }

}

###選擇合適的搜尋型別,預設就可以了,其次是count型別在統計查詢的時候用的多

參看:https://es.xiaoleilu.com/060_Distributed_Search/15_Search_options.html

搜尋型別:

query_and_fetch(最快最簡單的查詢,返回每個分片的前size個文件,即size*主分片數量,不常用。因為得到的文件並不是最相關的)、

query_then_fetch(預設,僅僅返回size個最相關的文件)

dfs_query_and_fetch(與query_and_fetch相似,只是IDF分數是全域性計算的而不是單個分片計算的,不建議生產環境使用。在後期Elasticsearch版本中已經去除。在資料量很多時本地的IDF值和全域性的IDF很接近,完全沒必要使用,白白浪費cpu資源)、

dfs_query_then_fetch(query_then_fetch相似,道理和上條一樣,也是計算全域性的IDF得分值)

count(只返回文件統計數量,不返回文件)、

scan(用於獲取大量資料,不對文件打分排序)

##高亮,很常用的方式

GET /megacorp/employee/_search

{

  "version": true,

  "query": {

    "term": {

      "about": "rock"

    }

  },

  "highlight": {

    "fields": {

      "about": {}

    }

  }

}

##高亮更換預設標籤

GET /megacorp/employee/_search

{

  "version": true,

  "query": {

    "term": {

      "about": "rock"

    }

  },

  "highlight": {

    "fields": {

      "about": {"pre_tags":["<br>"],"post_tags":["</br>"]}  

    }

  }

}

##高亮其它引數

GET /megacorp/employee/_search

{

  "version": true,

  "query": {

    "terms": {

      "about": [

        "climbing"

      ]

    }

  },

  "highlight": {

    "require_field_match":false,  ##其他欄位的term也會高亮顯示,但需要在fields中配置

    "fields": {

      "about": {

        "pre_tags": [

          "<br>"

        ],

        "post_tags": [

          "</br>"

        ],

        "number_of_fragments": 0  ##將返回全部欄位值

      },

      "last_name": {

        "pre_tags": [

          "<br>"

        ],

        "post_tags": [

          "</br>"

        ],

        "number_of_fragments": 0

      }

    }

  }

}

##自動補全,直接看例子。一共三種自動補全

自動補全:prefixedgeNGram、統計。都以分詞器為基礎

1prefix自動補全,term中要有相應的詞條才可以。下方term中必須有張三封張*’什麼的

GET /my_index9/my_type9/_search

{

  "query": {

    "prefix": {

      "name": {

        "value": "張三封張"

      }

    }

  }

}

2edgeNGram補全和統計的使用(當然統計可以不使用分詞),比prefix省資源。建立索引

PUT /my_index4

{

  "settings": {

    "index": {

      "analysis": {

        "analyzer": {

          "autocomplete": {  ##構建自定義分析器,用空格分詞

            "tokenizer": "whitespace",

            "filter": [

              "lowercase",  ##,之後過濾器處理“小寫”

              "engram"   ##邊緣分詞所有item

            ]

          }

        },

        "filter": {

          "engram": {

            "type": "edgeNGram",

            "min_gram": 3,  ##小於3個符號的邊緣詞不予儲存,中文是3個字,英文3個字母

            "max_gram": 10 ##大於10個符號的邊緣詞不予儲存

          }

        }

      }

    }

  },

  "mappings": {

    "my_type4": {

      "properties": {

        "name": {

          "type": "string",

          "analyzer": "autocomplete", ##name欄位使用上邊自定義的分析器

          "index": "analyzed",

          "search_analyzer": "autocomplete" ##查詢使用自定義分詞器,或者其他都可以

        },

        "country": {

          "type": "string"

        }

      }

    }

  }

}

加入條資料

PUT /my_index9/my_type9/6

{

    "name" : "張三封張三封",

    "country" :      "China"

}

找到所有含張三封’term的文件,然後統計所有term,這就可以看出edgeNGram的作用

GET /my_index4/my_type4/_search

{

  "size": 0,

  "query": {

    "term": {

      "name": "張三封"

    }

  },

  "aggs": {

    "all_interests": {

      "terms": { "field": "name" }

    }

  }

}