{"id":3612,"date":"2021-08-08T16:02:44","date_gmt":"2021-08-08T08:02:44","guid":{"rendered":"https:\/\/wyxxt.org.cn\/?p=3612"},"modified":"2023-12-04T14:51:37","modified_gmt":"2023-12-04T06:51:37","slug":"elasticsearch","status":"publish","type":"post","link":"https:\/\/wyxxt.org.cn\/?p=3612","title":{"rendered":"Elasticsearch"},"content":{"rendered":"<h2>Elasticsearch\u662f\u4ec0\u4e48<\/h2>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/www.elastic.co\/cn\/\">elastic\u5b98\u7f51<\/a><\/p>\n<p>\u5b58\u50a8\u3001\u641c\u7d22\u3001\u5206\u6790<\/p>\n<p>PB\u7ea7\u6570\u636e\uff0c\u8fd1\u5b9e\u65f6<\/p>\n<h2>\u5012\u6392\u7d22\u5f15<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/oss.wyxxt.org.cn\/images\/2021\/09\/18\/wp_editor_md_541e57a3deb5b9f95767a82ba9aa2d03.jpg\" alt=\"\" \/><\/p>\n<p><strong>\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4<\/strong><\/p>\n<h2>\u5b89\u88c5<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/oss.wyxxt.org.cn\/images\/2021\/09\/18\/wp_editor_md_ec365b9dd4cf6a20702a44921a53ca84.jpg\" alt=\"\" \/><\/p>\n<h3>elasticsearch<\/h3>\n<p>elasticsearch.yml<\/p>\n<pre><code class=\"language-yaml line-numbers\">xpack.ml.enabled: false\n<\/code><\/pre>\n<pre><code class=\"language-shell line-numbers\">elasticsearch -d\n<\/code><\/pre>\n<p><code>\u6ce8\u610f\u70b9<\/code><\/p>\n<p>\u4e0d\u8981\u4ee5root\u7528\u6237\u542f\u52a8<\/p>\n<p>\u7528\u6237 \u6587\u4ef6\u6570\u548c\u6253\u5f00\u8fdb\u7a0b\u6570\u8c03\u5927<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oss.wyxxt.org.cn\/images\/2021\/09\/18\/image-202109181440073454d556d2e22164f3d.png\" alt=\"image-20210918144007345\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oss.wyxxt.org.cn\/images\/2021\/09\/18\/wp_editor_md_e53dc80a266fb8788586c5f689f38cdd.jpg\" alt=\"\" \/><\/p>\n<h3>kibana<\/h3>\n<p>Elastic \u5b98\u65b9\u53ef\u89c6\u5316\u5de5\u5177\uff0c\u9700\u8981\u4e0ekibana\u4fdd\u6301\u7248\u672c\u4e00\u81f4<\/p>\n<p>kibana.yml<\/p>\n<pre><code class=\"language-yaml line-numbers\"># Default Kibana configuration for docker target\n\nserver.name: kibana\n\nserver.host: \"0\"\n\nelasticsearch.hosts: [\"http:\/\/172.16.213.133:9200\"]\n\nxpack.monitoring.ui.container.elasticsearch.enabled: true\n\ni18n.locale: \"zh-CN\"\n<\/code><\/pre>\n<p>docker \u547d\u4ee4<\/p>\n<pre><code class=\"language-shell line-numbers\">docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kibana -p 5601:5601 -v \/Users\/xingzhiwei\/kibana\/kibana.yml:\/usr\/share\/kibana\/config\/kibana.yml kibana:7.13.4\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/oss.wyxxt.org.cn\/images\/2021\/09\/18\/wp_editor_md_7c872a2d66439a42499e139da4b4f208.jpg\" alt=\"\" \/><\/p>\n<h2>\u4ee3\u7801\u793a\u4f8b<\/h2>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/www.tizi365.com\/archives\/850.html\">\u5927\u795e\u535a\u5ba2<\/a><\/p>\n<pre><code class=\"language-go line-numbers\">type Tweet struct {\n    User     string                `json:\"user\"`\n    Message  string                `json:\"message\"`\n    Retweets int                   `json:\"retweets\"` \/\/ \u8f6c\u53d1\u6570\n    Image    string                `json:\"image,omitempty\"`\n    Created  time.Time             `json:\"created,omitempty\"`\n    Tags     []string              `json:\"tags,omitempty\"`\n    Location string                `json:\"location,omitempty\"`\n    Suggest  *elastic.SuggestField `json:\"suggest_field,omitempty\"`\n}\n<\/code><\/pre>\n<h3>\u5efa\u7acb\u8fde\u63a5<\/h3>\n<pre><code class=\"language-go line-numbers\">client, err := elastic.NewClient(\n        \/\/ elasticsearch \u670d\u52a1\u5730\u5740\uff0c\u591a\u4e2a\u670d\u52a1\u5730\u5740\u4f7f\u7528\u9017\u53f7\u5206\u9694\n        elastic.SetURL(\"http:\/\/node02:9200\", \"http:\/\/node03:9200\"),\n        \/\/ \u57fa\u4e8ehttp base auth\u9a8c\u8bc1\u673a\u5236\u7684\u8d26\u53f7\u548c\u5bc6\u7801\n        elastic.SetBasicAuth(\"user\", \"secret\"),\n        \/\/ \u542f\u7528gzip\u538b\u7f29\n        elastic.SetGzip(true),\n        \/\/ \u8bbe\u7f6e\u76d1\u63a7\u68c0\u67e5\u65f6\u95f4\u95f4\u9694\n        elastic.SetHealthcheckInterval(10*time.Second),\n        \/\/ \u8bbe\u7f6e\u8bf7\u6c42\u5931\u8d25\u6700\u5927\u91cd\u8bd5\u6b21\u6570\n        elastic.SetMaxRetries(5),\n        \/\/ \u8bbe\u7f6e\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\n        elastic.SetErrorLog(log.New(os.Stderr, \"ELASTIC \", log.LstdFlags)),\n        \/\/ \u8bbe\u7f6einfo\u65e5\u5fd7\u8f93\u51fa\n        elastic.SetInfoLog(log.New(os.Stdout, \"\", log.LstdFlags)))\nif err != nil {\n    \/\/ Handle error\n    panic(err)\n}\n_ = client\n<\/code><\/pre>\n<h3>\u521b\u5efa\u7d22\u5f15<\/h3>\n<pre><code class=\"language-go line-numbers\">exists, err := client.IndexExists(\"twitter\").Do(ctx)\n    if err != nil {\n        panic(err)\n    }\n    if !exists {\n        const mapping = `\n        {\n            \"settings\":{\n                \"number_of_shards\":1,\n                \"number_of_replicas\":0\n            },\n            \"mappings\": {\n                \"properties\": {\n                    \"user\":{\n                        \"type\":\"keyword\"\n                    },\n                    \"message\":{\n                        \"type\":\"text\",\n                        \"store\":true,\n                        \"fielddata\":true\n                    },\n                    \"retweets\":{\n                        \"type\":\"long\"\n                    },\n                    \"image\":{\n                        \"type\":\"keyword\"\n                    },\n                    \"created\":{\n                        \"type\":\"date\"\n                    },\n                    \"tag\":{\n                        \"type\":\"date\"\n                    },\n                    \"location\":{\n                        \"type\":\"geo_point\"\n                    },\n                    \"suggest_field\":{\n                        \"type\":\"completion\"\n                    }\n                }\n            }\n        }`\n        createIndex, err := client.CreateIndex(\"twitter\").\n            BodyString(mapping).\n            Do(ctx)\n        if err != nil {\n            panic(err)\n        }\n        if !createIndex.Acknowledged {\n            \/\/ not acknowledged\n        }\n    }\n<\/code><\/pre>\n<h3>\u5220\u9664\u7d22\u5f15<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/delete an index\n    deleteIndex, err := client.\n        DeleteIndex(\"twitter\").\n        Do(ctx)\n    if err != nil {\n        panic(err)\n    }\n    if !deleteIndex.Acknowledged {\n        \/\/ not acknowledged\n        fmt.Println(\"not acknowledged\")\n    }\n<\/code><\/pre>\n<h3>\u6dfb\u52a0\u6587\u6863<\/h3>\n<pre><code class=\"language-go line-numbers\">tweet1 := Tweet{  User:     \"olivere\",  Message:  \"Take Five\",  Retweets: 0,  Created:  time.Now(),}put1, err := client.Index().Index(\"twitter\").Id(\"1\").BodyJson(tweet1).Do(ctx)if err != nil {  panic(err)}fmt.Printf(\"Indexed tweet %s to index %s, type %s\\n\", put1.Id, put1.Index, put1.Type)tweet2 := `{\"user\":\"olivere\", \"message\":\"It's a Raggy Waltz\", \"retweets\":0, \"created\":\"2021-08-01T14:43:05.840648+08:00\"}`put2, err := client.Index().Index(\"twitter\").Id(\"2\").BodyString(tweet2).Do(ctx)if err != nil {  panic(err)}fmt.Printf(\"Indexed tweet %s to index %s, type %s\\n\", put2.Id, put2.Index, put2.Type)\n<\/code><\/pre>\n<h3>\u67e5\u8be2\u6587\u6863<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/ Get tweet with specified ID  get1, err := client.Get().      Index(\"twitter\").       Id(\"1\").        Do(ctx) if err != nil {     switch {        case elastic.IsNotFound(err):           panic(fmt.Sprintf(\"Document not found: %v\", err))       case elastic.IsTimeout(err):            panic(fmt.Sprintf(\"Timeout retrieving document: %v\", err))      case elastic.IsConnErr(err):            panic(fmt.Sprintf(\"Connection problem: %v\", err))       default:            \/\/ Some other kind of error         panic(err)      }   }   msg1 := Tweet{} data, _ := get1.Source.MarshalJSON()    json.Unmarshal(data, &amp;msg1) fmt.Println(msg1)   fmt.Printf(\"Got document %s in version %d from index %s, type %s\\n\", get1.Id, get1.Version, get1.Index, get1.Type)  \/\/ search with a term query searchResult, err := client.Search().       Index(\"twitter\").       Query(elastic.NewTermQuery(\"user\", \"olivere\")).     Sort(\"user\", true).     From(0).        Size(10).       Pretty(true).       Do(ctx) if err != nil {     panic(err)  }   fmt.Printf(\"Query took %d milliseconds\\n\", searchResult.TookInMillis)   var ttyp Tweet  for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) {      t := item.(Tweet)       fmt.Printf(\"Tweet by %s: %s\\n\", t.User, t.Message)  }   fmt.Printf(\"Found a total of %d tweets\\n\", searchResult.TotalHits())    if searchResult.TotalHits() &gt; 0 {       fmt.Printf(\"Found a total of %d tweets\\n\", searchResult.TotalHits())        for _, hit := range searchResult.Hits.Hits {            var t Tweet         err := json.Unmarshal(hit.Source, &amp;t)           if err != nil {             panic(err)          }           fmt.Printf(\"Tweet by %s: %s\\n\", t.User, t.Message)      }   } else {        fmt.Print(\"Found no tweets\\n\")  }\n<\/code><\/pre>\n<h3>\u66f4\u65b0\u6587\u6863<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/ update a tweet by the update API of Elasticsearch    script := elastic.NewScript(\"ctx._source.retweets += params.num\").Param(\"num\", 1)   update, err := client.Update().Index(\"twitter\").Id(\"1\").Script(script).     Upsert(map[string]interface{}{\"retweets\": 0}).Do(ctx)   if err != nil {     panic(err)  }   fmt.Printf(\"New version of tweet %q is now %d\", update.Id, update.Version)\n<\/code><\/pre>\n<h3>\u5220\u9664\u6587\u6863<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/ delete a tweet by id _, err = client.Delete().       Index(\"twitter\").       Id(\"1\").        Do(ctx) if err != nil {     panic(err)  }   \/\/ delete a tweet by termQuery  _, err = client.DeleteByQuery(\"twitter\").       Query(elastic.NewTermQuery(\"user\", \"olivere\")).     \/\/ \u7248\u672c\u51b2\u7a81\u7ee7\u7eed\u6267\u884c     ProceedOnVersionConflict().     Do(ctx) if err != nil {     panic(err)  }\n<\/code><\/pre>\n<h3>\u7cbe\u786e\u67e5\u8be2<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/ \u7cbe\u786e\u5339\u914d\u5355\u4e2a\u5b57\u6bb5 searchResult, err = client.Search().        Index(\"twitter\").       Query(elastic.NewTermQuery(\"message\", \"take\")).     Sort(\"created\", true).      From(0).        Size(10).       Pretty(true).       Do(ctx) if err != nil {     panic(err)  }   fmt.Printf(\"\u67e5\u8be2\u6d88\u8017\u65f6\u95f4 %d ms, \u7ed3\u679c\u603b\u6570: %d\\n\", searchResult.TookInMillis, searchResult.TotalHits()) if searchResult.TotalHits() &gt; 0 {       \/\/ \u67e5\u8be2\u7ed3\u679c\u4e0d\u4e3a\u7a7a\uff0c\u5219\u904d\u5386\u7ed3\u679c        var r Tweet     \/\/ \u901a\u8fc7Each\u65b9\u6cd5\uff0c\u5c06es\u7ed3\u679c\u7684json\u7ed3\u6784\u8f6c\u6362\u6210struct\u5bf9\u8c61     for _, item := range searchResult.Each(reflect.TypeOf(r)) {         if t, ok := item.(Tweet); ok {              fmt.Println(t)          }       }   }\/\/ \u901a\u8fc7terms\u5b9e\u73b0SQL\u7684in\u67e5\u8be2   searchResult, err = client.Search().        Index(\"twitter\").       Query(elastic.NewTermsQuery(\"message\", \"take\", \"five\", \"raggy\")).       From(0).        Size(10).       Do(ctx) if err != nil {     panic(err)  }\n<\/code><\/pre>\n<h3>\u6a21\u7cca\u67e5\u8be2<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/ \u6a21\u7cca\u5339\u914d\u5355\u4e2a\u5b57\u6bb5 searchResult, err = client.Search().        Index(\"twitter\").       Query(elastic.NewMatchQuery(\"message\", \"take raggy\")).      From(0).        Size(10).       Do(ctx) if err != nil {     panic(err)  }\n<\/code><\/pre>\n<h3>\u8303\u56f4\u67e5\u8be2<\/h3>\n<pre><code class=\"language-go line-numbers\">\/\/ \u8303\u56f4\u67e5\u8be2 searchResult, err = client.Search().        Index(\"twitter\").       Query(elastic.NewRangeQuery(\"created\").Gte(\"2021-08-01\").Lt(\"2021-08-20\")).     From(0).        Size(10).       Do(ctx)\n<\/code><\/pre>\n<h3>bool\u7ec4\u5408\u67e5\u8be2<\/h3>\n<h4>must<\/h4>\n<pre><code class=\"language-go line-numbers\">\/\/ must \/\/ \u521b\u5efa bool \u67e5\u8be2\u6761\u4ef6 boolQuery := elastic.NewBoolQuery().Must()  \/\/ \u521b\u5efa term \u67e5\u8be2   termQuery := elastic.NewTermQuery(\"user\", \"olivere\")    matchQuery := elastic.NewMatchQuery(\"message\", \"take a\")    \/\/ \u8bbe\u7f6ebool\u67e5\u8be2\u7684must\u6761\u4ef6, \u7ec4\u5408\u4e86\u4e24\u4e2a\u5b50\u67e5\u8be2    \/\/ \u8868\u793a\u641c\u7d22\u5339\u914duser=olivere\u4e14message\u5339\u914d\"take a\"\u7684\u6587\u6863  boolQuery.Must(termQuery, matchQuery)   searchResult, err = client.Search().        Index(\"twitter\").       Query(boolQuery).       From(0).        Size(10).       Do(ctx)\n<\/code><\/pre>\n<h4>must_not<\/h4>\n<pre><code class=\"language-go line-numbers\">\/\/ \u521b\u5efa bool \u67e5\u8be2\u6761\u4ef6 boolQuery = elastic.NewBoolQuery().Must()   \/\/ \u521b\u5efa term \u67e5\u8be2   \/\/termQuery = elastic.NewTermQuery(\"user\", \"olivere\")   matchQuery = elastic.NewMatchQuery(\"message\", \"take five\")  boolQuery.MustNot(matchQuery)\n<\/code><\/pre>\n<h4>should<\/h4>\n<pre><code class=\"language-go line-numbers\">\/\/ should \u6761\u4ef6    boolQuery = elastic.NewBoolQuery().Must()   \/\/ \u521b\u5efa term \u67e5\u8be2   termQuery = elastic.NewTermQuery(\"user\", \"olivere\") matchQuery = elastic.NewMatchQuery(\"message\", \"take five\")  boolQuery.Should(termQuery, matchQuery) searchResult, err = client.Search().        Index(\"twitter\").       Query(boolQuery).       From(0).        Size(10).       Do(ctx)\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Elasticsearch\u662f\u4ec0\u4e48 elastic\u5b98\u7f51 \u5b58\u50a8\u3001\u641c\u7d22\u3001\u5206\u6790 PB\u7ea7\u6570\u636e\uff0c\u8fd1\u5b9e\u65f6 \u5012\u6392\u7d22\u5f15 \u4ee5\u7a7a\u95f4\u6362 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[15],"tags":[390],"class_list":["post-3612","post","type-post","status-publish","format-standard","hentry","category-15","tag-390"],"_links":{"self":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts\/3612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3612"}],"version-history":[{"count":3,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts\/3612\/revisions"}],"predecessor-version":[{"id":3653,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts\/3612\/revisions\/3653"}],"wp:attachment":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}