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の絶好のツールです.
索引と検索
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データインポートの問題を処理しているようです.
なぜElasticSearchを使うのですか?最初はMySQLで簡単な検索を行い、LIKE文をインデックスして直接MySQLの性能を下げることはできません.その後、Sphinxを考慮したが、データレベル、複数のMySQL、検索サービス自体のHA、後続の拡張などの問題では、Sphinxは最適な選択ではない.
ESプロジェクトでの使用に関する問題:
データはすべてMySQLから生成されるため、indexのfieldは固定されており、主な仕事はビジネスシーンに応じて対応するmappingとsearch文を設計し、絶えずチューニングすることです.
データソースについては、MySQLのデータをESにツールでインポートする必要があります.検索のリアルタイム性が高いため、MySQL増分データをリアルタイムでインポートする必要があります.row based binlogで完了できます.
ESキーコンセプト
データレベル
MySQLと比較すると、indexはdb、documentは1行のデータ、fieldはtableのcolumn、mappingはtableの定義、document typeはtableであればよいと考えられる必要があります.
document typeは、indexの一部のデータが1つのクエリー方式を使用したい場合、別の一部のデータが別のクエリー方式を使用したい場合など、より良いクエリーのために、2つのtypeによって使用されます.しかし、このような状況はプロジェクトでは現れないはずなので、通常、1つのindexの下には1つのtypeしかありません.
サービスレベル
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を使用してこれらのリソースを操作
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データインポートの問題を処理しているようです.