Elasticsearch v2.2クイックエントリー(curl,Sense,pythonの3つのクライアント方式を含む)

29972 ワード

Elasticsearch v2.2クイックエントリー(curl,Sense,pythonの3つのクライアント方式を含む)著者:AbnerGong
私は1週間かけてドキュメントと前人のブログを見て、やっと入門レベルに達したばかりです.この文章を書くのは皆さんに足場を作って、皆さんが入門に時間をかけないことを望んでいます.同时に私もみんなと互いに学ぶことができることを望んで、もし各位が更に1歩进む文章を书いて、あるいは本文の中で省略した多くの细かい点を补充して、住所を返事の中で贴ることを歓迎して、とても感谢します!
Elasticsearchの基本概念を理解する:Elasticsearch学習ノートを読むことをお勧めします[email protected]
  • インデックスIndex,検索searchは基本概念であり,本稿で主に注目する側面でもある.
  • Luceneの重要な概念:Documentはデータであり、複数のFieldを含む.各Fieldにはnameとvalueが含まれています.分詞(Analyzed)の場合、各値には複数のTermが含まれ、分詞しない場合、値全体が1つのTermとなる.実際のストレージ方式Inverted indexはTermを主キーとし、各Termがどのドキュメントのどの位置に現れるか、つまりTokenであり、実際に検索するときはTermテーブルで検索されます.
  • ElasticsearchをMySQLと比較して理解しやすい:index=DBデータベース;type=table 1枚のテーブル;Mapping=schemaテーブルに含まれるドメインとそのタイプ.Document=rowデータ;Field = column;重合aggs=groupby
  • Node,Cluster,Shard,Replicaの基本概念.1.1.1基本概念
  • も参照することができる.
  • Restful APIの基本概念.アクセスツール:httpieまたはSenseエディタ
  • 検索と検索:Elasticsearch権威ガイド翻訳byを強くお勧めしますQQ1350995917@2014/05
    我々はすでにMegacorp社のHR部門の一員として、雇用者と従業員の間の転位思考とリアルタイムの動的な協同作業をサポートするemployeeのディレクトリを構築することを受け取ったと仮定します.データには、いくつかの値のtags、数値、全文が含まれるはずです.2.従業員の詳細を取得できます.3.30歳以上の従業員を見つけるなど、構造化された検索を許可します.4.簡単な全文検索とより複雑なフレーズ検索を許可する.5.検索条件を満たすドキュメントからクリップをハイライトできます.6.雇用主がデータに基づいてデータ分析グラフを生成できるようにする.
    インデックスの作成/削除/検証:
    #curl
    $ curl -XPUT 'http://localhost:9200/megacorp/'   #  index
    $ curl -XPUT 'http://localhost:9200/megacorp/' -d '  #  Index          
    index :
        number_of_shards : 3   #   5, 5   
        number_of_replicas : 2   #   1,       1   
    '
    $ curl -XDELETE 'http://localhost:9200/twitter/'  #  index 
    $ curl -XHEAD -i 'http://localhost:9200/twitter'
    
    #Sense
    PUT megacorp
    
    #Python
    es.indices.create(index="megacorp")
    es.indices.delete(index="megacorp")
    es.indices.exists(index="megacorp")

    テーブル構造の作成/削除/読み込み:Mapping
    mappingは製図、スペクトルを意味し、ここではインデックス内の構造図に相当し、構造と略称する.インデックス、インデックスのタイプ、インデックスのタイプのフィールドには、その構造(mapping)があることに注意してください.
    #curl,  
    curl -XPOST localhost:9200/customer -d '{
        "settings" : {
            "number_of_shards" : 1
        },
        "mappings" : {
            "type1" : {
                "properties" : {
                    "field1" : { "type" : "string", "index" : "not_analyzed" }
                }
            }
        }
    }'
    #     
    curl -XGET 'http://localhost:9200/twitter/_mapping/tweet'
    
    #Sense
    #              
    PUT customer
    {
      "mappings": {  #       
        "user": {   #    user
          "_all":       { "enabled": false  },  #   meta _all
          "properties": {   #         
            "title":    { "type": "string"  },     #     ,       ,   string     
            "name":     { "type": "string"  }, 
            "age":      { "type": "integer" }  
          }
        },
        "blogpost": { 
          "properties": { 
            "title":    { "type": "string"  }, 
            "body":     { "type": "string"  }, 
            "user_id":  {
              "type":   "string", 
              "index":  "not_analyzed"     #     
            },
            "created":  {
              "type":   "date", 
              "format": "strict_date_optional_time||epoch_millis"   #         
            }
          }
        }
      }
    }
    #     
    GET twitter/_mapping/tweet,user  #    ,     ,       
    GET twitter/_mapping  #    ,      
    GET _mapping/tweet    #     ,     
    GET _mapping   #     ,     ,      
    #         
    GET publications/_mapping/article/field/author.id,abstract,name  #    ,   _mapping,    ,   field,    
    GET _all/_mapping/tw*/field/*.id  #      
    GET _mapping/field/*       #     ,     ,      。  */
    
    #Python
    #          ,   false  False
    q = {
      "mappings": {
        "user2": {
          "_all":       { "enabled": False  },
          "properties": {
            "title":    { "type": "string"  },
            "name":     { "type": "string"  },
            "age":      { "type": "integer" }
          }
        }
      }
    }
    es.indices.create(index="customer",body=q)  #               
    #          ,          。                   。
    requestbody = {
          "_all":       { "enabled": False  },
          "properties": {
            "title":    { "type": "string"  },
            "name":     { "type": "string"  },
            "age":      { "type": "integer" }
          }
        }
    print es.indices.put_mapping(index="custom",doc_type="user",body=requestbody)
    #          
    es.indices.get_mapping(index="custom", doc_type="user") #          
    es.indices.get_field_mapping(index="custom",doc_type="user2",fields=["name","age"])  
    #       
    es.indices.exists_type(index="custom",doc_type="user")  #        

    取得(情報を挿入):
    #curl
    curl -GET 'http://localhost:9200/megacorp/employee/1?pretty'
    
    {
        "first_name":  "John",
        "last_name":   "Smith",
        "age":         25,
        "about":       "I love to go rock climbing",
        "interests":  ["sports","music"]
    }
    
    #sense
    PUT megacorp/employee/1
    {
        "first_name":"John",
        "last_name":  "Smith",
        "age":        25,
        "about":      "I love to go rock climbing",
        "interests":["sports","music"]
    }
    
    #python
    body={
        "first_name":"John",
        "last_name":  "Smith",
        "age":        25,
        "about":      "I love to go rock climbing",
        "interests":["sports","music"]
    }
    es.create(index="megacorp", doc_type="employee", id=1,body=body)

    単純検索(インデックス/タイプ/id番号を指定)
    【注意】挿入0秒後にすぐに検索しないでください.調べられません.1 s待たなければ調べられません.以下同.
    #curl
    curl -GET 'http://localhost:9200/megacorp/employee/1?pretty'
    
    #Sense
    GET megacorp/employee/1?pretty
    
    #python
    es.get(index="megacorp", doc_type="employee", id=1)

    単純検索(文字列の検索)
    #curl
    curl -XGET 'http://localhost:9200/_search?pretty' #         
    curl -XGET 'http://localhost:9200/megacorp/employee/_search?pretty' #     /  
    curl -XGET 'http://localhost:9200/_search?q=about:"go rock"&pretty' #       about       "go rock"       
    curl -XGET 'http://localhost:9200/megacorp/employee/_search?q=about:"go rock"&pretty' #    
    
    #Sense
    GET _search?pretty #         
    GET megacorp/employee/_search?pretty #    /  ,       
    GET _search?q=about:"go rock"&pretty #       about       "go rock"       
    GET megacorp/employee/_search?q=about:"go rock"&pretty #    
    
    #python
    es.search() #     。    es.search()["hits"]["hits"]     ,     dict  ,  "_index""_type""_id""_source""_score"   
    es.search(filter_path=['hits.hits._id', 'hits.hits._type']) #          ,            dict     "_id" "_type"  
    es.search(filter_path=['hits.hits._*']) #          
    es.search(index='megacorp', doc-type="employee") #    /  ,       
    es.search(from_=3, size=5) #   335   
    #        [API documentation](http://elasticsearch-py.readthedocs.org/en/master/api.html)

    Search DSL検索の使用方法
    前の検索条件はURLの後ろのパラメータに入れて、簡単な検索しかできません.複雑な検索を実行するには、検索条件をJSONに入れ、データでサーバに渡すSearch DSLが必要です.例えば、aboutに完全な「go rock」が含まれている検索は、以下のように書くことができます.
    #curl
    curl -XGET 'http://localhost:9200/_search?pretty' -d
     {"from" : 0, "size" : 10,
    "query":{"match_phrase":{"about":"go rock"}}}
    
    #Sense
    GET _search?pretty
     {"from" : 0, "size" : 10,
    "query":{"match_phrase":{"about":"go rock"}}}
    
    #python
    body = {"from" : 0, "size" : 10,
    "query":{"match_phrase":{"about":"go rock"}}}
    es.search(body = body) #       

    明らかに、curl/Sense/pythonの3つの方式のJSON部分は完全に同じ(すなわち、Search DSL)であり、JSONではない部分は検索とは関係ない.つまり、検索条件をどのように変更しても、JSONではない部分は変更する必要はない.私たちが研究しているのはJSON部分だけなので、次のコードはcurl、Sense、pythonを区別することなくJSON部分だけを含む.
    上記のコードには、Search DSLには「from」、「size」、「query」の3つのフィールドが含まれており、「query」はクエリーする内容を表し、「from」はいくつかの結果をスキップすることを表し、「size」はいくつかの結果を返すことを表す.これは例を挙げると、Search DSLには、Query DSL、from/size、Sort、Source filtering、fields、Script fields、Field Data Fields、Post filter、Highlighting、Rescoring、Seach Type、Scrollなど、多くのフィールドがあります.これらのフィールドの意味と使い方を一つ一つ説明します.
    Query DSL
    0.重要な前言
    勉強を続ける前に、Search DSL(検索DSL)とQuery DSL(クエリーDSL)の違いを強調します.これらの違いは、Search DSLはQuery DSLを含み、Search DSLは実行可能であり、Query DSLは条件のみを表し、Search DSLのフィールドの1つである.上の例では
    QueryDSL = {"match_phrase":{"about":"go rock"}}  #      ,    about   "go rock"    
    SearchDSL = {"query": {"match_phrase":{"about":"go rock"}} } #      ,        

    検索と検索の中国語での意味の差は多くなく、直感的ではないと思いますので、Queryを条件に翻訳します.Query DSL(条件DSL)はleaf query(原子条件)、compound query(複合条件)の2種類に分類される.明らかにQuery DSL(条件DSL)は私たちがクエリーする条件を表すことができ、任意の条件を組み合わせてより複雑な条件にすることもできますが、どのように組み合わせても、条件は最終的なJSONオブジェクトではなく、条件にquery(採点)またはfilter(フィルタ)を追加して実行する必要があります.次に原子条件と複雑な条件を紹介します.公式ページを参照することもできますが、テスト時には、最外層がqueryやfilterではないのは条件だけで、最終JSONオブジェクトではなく、直接クエリーに使用することはできません.使用前にコートを1階にしなければなりません.
    1.原子条件
    例えば、これが条件だと思います.{"match_phrase":{"about":"go rock"}}はこの条件を表すことができます.明らかに、この条件はJSONの中の最小単位であり、一応原子条件(leaf query clause)と呼ばれ、原子条件は当然複合条件に組み合わせることができるが、これは後で言う.
    原子条件はmatchクラス(Full text queries)とtermクラス(Term level queries)に分けられ、それらの概念は2つのリンクの冒頭で紹介されているが、本稿の冒頭ではすべてのドメインがTermテーブルで格納されている(分詞or非分詞)、検索時に実際にはTermテーブルが検索され、matchが検索対象文字列を先に分詞してからTermsで検索するのとは異なり、termは、文字列全体を無分詞で直接Termテーブルで検索します.つまり、検索した文字列の分詞はmatchであるかtermであるかに関係しています.検索したドメインの分詞は関係ありません.具体的な例はTerm Queryを参照してください.
    matchクラス(Full text queries))
    match、multi_を含むmatch、common_terms、query_string、simple_query_stringは全部で5種類あり、以下に一つ一つ列挙する.
    #    
    {"match":{"about":"go suck"}} #match        1   
    {"match_phrase":{"about":"go rock"}} #match_phrase         
    
    #    ,        
    {"match":{
         "about" : {
                "query" : "go suck",
                "operator" : "and",
                "zero_terms_query": "all"
            }
    }}
    {"match_phrase" : {
            "about" : {
                "query" : "go rock",
                "analyzer" : "my_analyzer"
            }
    }}
    {"match_phrase_prefix" : {
            "message" : {
                "query" : "go rock",
                "max_expansions" : 10
            }
    }}

    multi_match:matchのマルチドメインバージョン、すなわちいくつかのドメインが文字列commonを検索するterms:より専門的なクエリー、より優先的に辺鄙な語query_string: simple_query_string:
    termクラス(Term level queries)
    全文検索は実行前にqueryを分詞し、term-levelクエリはinverted indexに格納されているtermsを正確に操作します.これらのクエリは、通常、全文ドメインではなく、数値、日付、列挙などの構造化データとして使用されます.また、分析プロセスの前にcraftの低レベルクエリーを許可します.termクラスにはterm、terms、range、exists、missing、prefix、wildcard、regexp、fuzzy、type、idsが含まれます.以下に、term:指定されたドメインに指定された完全語(exact term)を含むドキュメントterms rangeを見つけます.
    #    
    { "range":{"age":{"gt":30}}}
    
    #    ,       :
    #gte ≥,gt >,lte ≤,lt <,boost     (   1)
    {"range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
    }}
    #    ,       
    {
        "range" : {
            "date" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
    }
    {
        "range" : {
            "born" : {
                "gte": "01/01/2012",
                "lte": "2013",
                "format": "dd/MM/yyyy||yyyy"
            }
        }
    }
    {"range" : {
            "timestamp" : {
                "gte": "2015-01-01 00:00:00", 
                "lte": "now", 
                "time_zone": "+01:00"
            }
    }}
    {"range" : {
             "postDate" : {
                  "from" : "2010-03-01",
                  "to" : "2010-04-01"
             }
    }}

    exists missing prefix wildcard:regexp:ドキュメントを見つけます.その指定ドメインには、特定の正規表現に一致する語fuzzyが含まれています.ドキュメントを見つけます.その指定ドメインには、指定された語と曖昧に似た語が含まれています.曖昧性Levenshtein編集距離によってtypeを決定する:指定されたタイプのドキュメントidsを見つける:指定されたタイプとIDのあるドキュメントを見つける
    詳細は全文検索(full-text queries)を参照してください.
    2.複合条件
    いくつかの原子条件は結合語で大きな複合条件に接続することができる.連結語はcompound queriesを参照してください.以下に列挙します.
    bool
    構文:各条件に限定論理語(must/filter/should/must_not)を追加し、boolで接続します.条件を総合的に考慮し、スコアを加算できます.must(出現して寄与しなければならない)、filter(出現しなければならないが点数は無視される)、should(その中の複数の原子条件は少なくともminimum_should_match個が成立しなければならない)、must_not(現れない)注意:各条件はmatchクラス/termクラス原子条件であってもよいし、複合条件であってもよい.限定論理語はqueryではなく、参照ドキュメントにqueryが表示されますが、親測に失敗します.
    {
        "bool" : {
            "must" : {
                "term" : { "user" : "kimchy" }
            },
            "filter": {
                "term" : { "tag" : "tech" }
            },
            "must_not" : {
                "range" : {
                    "age" : { "from" : 10, "to" : 20 }
                }
            },
            "should" : [
                {
                    "term" : { "tag" : "wow" }
                },
                {
                    "term" : { "tag" : "elasticsearch" }
                }
            ],
            "minimum_should_match" : 1,
            "boost" : 1.0
        }
    }
     python    :
    atom1={"match":{"data":"really me"}} #    
    atom2={"term":{"data":"bore"}} #    
    atom3={"match_all":{}} #    
    comp={"bool":{"filter":atom2}} #    
    comp={"bool":{"filter":comp}} #f         
    body={"filter":comp}  #    

    boosting
    構文:各条件にpositive/negative限定語を追加し、boostingで接続します.役割:一部の条件を減点できます.私たちはboolの中でNOTの内容が現れる時削除されることを知っていて、ここでnegativeの内容が現れる時削除されないで減点します
    {
        "boosting" : {  
            "positive" : { 
                "term" : {  
                    "field1" : "value1"
                }
            },
            "negative" : {  
                "term" : {
                    "field2" : "value2"
                }
            },
            "negative_boost" : 0.2 
        }
    }
    #     :boosting>(postive>  +negative>  +negative_boost: )

    constant_score
    使用法:各条件に修飾語filterまたはqueryを追加し、constant_を使用します.scoreがつながっている:最終スコアを定数に変更します.中でquery/filter+match/termのどの組み合わせを使っても、最終的な得点は定数で、boostは1.2で何の役に立つか分かりません.
    {
        "constant_score" : {
            "filter" : {
                "term" : { "user" : "kimchy"}
            },
            "boost" : 1.2
        }
    }

    dis_max
    使用法:比較的に長くて、詳しく見ていません:boolはいくつかの項目の得点を加算して、それはいくつかの項目の中で最も良い得点を取ります.いくつかの条件のうち1つが満たされればよい.
    {
        "dis_max" : {
            "tie_breaker" : 0.7,
            "boost" : 1.2,
            "queries" : [
                {
                    "term" : { "age" : 34 }
                },
                {
                    "term" : { "age" : 35 }
                }
            ]
        }
    }

    function_score
    indices
    【注意】and,or,filteredは廃棄されていますのでboolで代用してください