ElasticSearchノート

3261 ワード

ElasticSearchは非常に優秀な分布式検索プログラムで、RESTful APIを提供し、下層はLuceneに基づいて、マルチshared方式を採用してデータの安全を保証し、自動resharding機能を提供する.
なぜElasticSearchを使うのですか?最初はMySQLで簡単な検索を行い、LIKE文をインデックスして直接MySQLの性能を下げることはできません.その後、Sphinxを考慮したが、データレベル、複数のMySQL、検索サービス自体のHA、後続の拡張などの問題では、Sphinxは最適な選択ではない.
ESプロジェクトでの使用に関する問題:
  • インデックス:検索するデータに対して、適切なインデックスをどのように確立するか、特定の言語に応じて異なるanalyzerなどを使用する必要があります.
  • 検索:ESは非常に強力な検索機能を提供し、どのように効率的な検索文を書きますか?
  • データソース:MySQLは唯一のデータソースですが、どのようにしてMySQLのデータをESにインポートしますか?

  • データはすべてMySQLから生成されるため、indexのfieldは固定されており、主な仕事はビジネスシーンに応じて対応するmappingとsearch文を設計し、絶えずチューニングすることです.
    データソースについては、MySQLのデータをESにツールでインポートする必要があります.検索のリアルタイム性が高いため、MySQL増分データをリアルタイムでインポートする必要があります.row based binlogで完了できます.
    ESキーコンセプト
    データレベル
  • index:ESは、リレーショナル・データベースのdbの概念と同様に、データを格納するために使用される論理領域である.1つのindexは、1つ以上のshard上に存在してもよく、1つのshardは、複数のreplicasによってもよい.
  • document:ESに格納されているエンティティデータは、リレーショナルデータのtableの1行のデータに似ています.documentは複数のfieldからなり、異なるdocumentで同名のfieldは必ず同じタイプを持っている.documentではfieldが繰り返し表示されます.つまり、1つのfieldは複数の値、すなわちmultivaluedによって表示されます.
  • document type:クエリーの必要性のために、1つのindexは複数のdocument、すなわちdocument typeによって使用される可能性があります.異なるdocumentで同じ名前のfieldは必ず同じタイプです.
  • mapping:fieldに関するマッピング情報を格納し、document typeによってmappingが異なります.

  • MySQLと比較すると、indexはdb、documentは1行のデータ、fieldはtableのcolumn、mappingはtableの定義、document typeはtableであればよいと考えられる必要があります.
    document typeは、indexの一部のデータが1つのクエリー方式を使用したい場合、別の一部のデータが別のクエリー方式を使用したい場合など、より良いクエリーのために、2つのtypeによって使用されます.しかし、このような状況はプロジェクトでは現れないはずなので、通常、1つのindexの下には1つのtypeしかありません.
    サービスレベル
  • node:serverのインスタンス
  • cluster:複数のnodeからなるcluster
  • shard:データスライス、1つのindexが複数のshardsに存在する可能性があり、異なるshardsが異なるnodesに存在する可能性があります.
  • replica:shardのバックアップはprimary shardで、残りはreplica shardsと呼ばれます.

  • ESが動的にreshardingできるのは,最初から複数のshardsを予め割り当て,shards単位でデータ移行を行うことにある.この方法は実際には分散分野で非常に一般的であり,codisは1024個のslotを用いてデータ移行を行う.
    RESTful API
    ESはRESTful APIを提供し、JSON形式を使用し、外部とのインタラクションを非常に容易にする.RESTfulインタフェースは簡単で、URLは特定のリソースを表し、例えば/blog/article/1はindexがblog、typeがarticle、idが1のdocumentを表す.
    HTTP標準methodを使用してこれらのリソースを操作
  • POST新規
  • PUT更新
  • GET取得
  • DELETE削除
  • HEADは存在するか否かを判定する.

  • HTTPIE
    HTTPIEをお勧めします.非常に強力なHTTPツールで、curlのように、ほとんどコマンドラインデバッグESの絶好のツールです.
    # get
    $ http GET : 9200/blog/article/1
    
    # create
    $ http POST :9200/blog/article/1 title="hello" tags:='["elasticsearch"]'
    
    # update
    $ http PUT :9200/blog/article/1 title="hello" tags:='["elasticsearch","world"]'
    
    # delete
    $ http DELETE :9200/blog/article/1
    
    # exists
    $ http HEAD :9200/blog/article/1
    

    索引と検索
    ESはfieldタイプを自動的に判断し、適切なインデックスを確立することができるが、後続の検索サービスのためにより良いインデックスルールを設定することを推奨する.mappingをカスタマイズすることで、異なるfieldのインデックスルールを設定します.検索については、ESは多くの検索オプションを提供しています.インデックスと検索はESの非常に重要な2つの側面であり,製品の検索体験に直接関係している.
    MySQLデータの同期
    ESは強力ですが、十分なデータがある場合、MySQLのデータをESにインポートする方法を確立します.現在、elasticsearch-river-jdbcやelasticsearch-river-mysqlなどの実装があります.
    Elasticsearch-river-jdbcは強力ですが、インクリメンタルデータの更新をうまくサポートしていないため、対応するテーブルは増減しないだけで、ほとんどプロジェクトではできません.
    Elasticsearch-river-mysqlはpython-mysql-replicationを採用しbinlogで変更したデータを取得し、インクリメンタル更新を行い、SQL Mydumpデータインポートの問題を処理しているようです.