全文検索エンジンElasticSearch初心者実戦チュートリアル

12309 ワード

全文検索は最も一般的なニーズに属し、オープンソースのElasticSearch(以下Elasticと略称する)は現在の全文検索エンジンの第一選択である.大量のデータを迅速に保存、検索、分析できます.ウィキペディア、Stack Overflow、Githubが採用しています.Elasticの下部はオープンソースライブラリLuceneです.しかし、Luceneを直接使うことはできません.自分でコードを書いてインタフェースを呼び出さなければなりません.ElasticはLuceneのパッケージで、REST APIの操作インタフェースを提供し、開梱して使用します.本文はゼロから、Elasticを使って自分の全文検索エンジンを構築する方法を説明します.一歩一歩詳しく説明されているので、みんなでやればマスターできます.一、ElasticをインストールするにはJava 8環境が必要です.もしあなたのマシンにJavaがインストールされていない場合は、この記事を参考にして、環境変数JAVAを保証することに注意してください.HOMEが正しく設定されています.Javaのインストールが完了すると、公式ドキュメントに従ってElasticをインストールできます.圧縮パッケージを直接ダウンロードするのは簡単です.
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip  $ unzip elasticsearch-5.5.1.zip  $ cd elasticsearch-5.5.1/
次に、解凍されたディレクトリに入り、次のコマンドを実行してElasticを起動します.
$ ./bin/elasticsearch
このタイムズが「max virtual memory areas vm.max map count[65530]is toolow」と間違っている場合は、次のコマンドを実行します.
$ sudo sysctl -w vm.max_map_count=262144
すべてが正常であれば、Elasticはデフォルトの9200ポートで実行されます.このとき、別のコマンドラインウィンドウを開き、そのポートを要求すると、説明情報が得られます.
$ curl localhost:9200  {   "name" : "atntrTf",   "cluster_name" : "elasticsearch",   "cluster_uuid" : "tf9250XhQ6ee4h7YI11anA",   "version" : {     "number" : "5.5.1",     "build_hash" : "19c13d0",     "build_date" : "2017-07-18T20:44:24.823Z",     "build_snapshot" : false,     "lucene_version" : "6.6.0"   },   "tagline" : "You Know, for Search" }
上のコードでは、9200ポートが要求され、Elasticは現在のノード、クラスタ、バージョンなどの情報を含むJSONオブジェクトを返します.Ctrl+Cを押すとElasticが停止します.デフォルトでは、Elasticはネイティブのみのアクセスを許可する、リモートアクセスが必要な場合は、Elasticインストールディレクトリのconfig/elasticsearchを変更することができる.ymlファイル、networkを削除します.hostのコメントは、その値を0.0.0.0に変更し、Elasticを再起動します.
network.host: 0.0.0.0
上のコードでは、0.0.0.0に設定して誰でもアクセスできます.オンラインサービスはこのように設定しないで、具体的なIPに設定します.二、基本概念2.1 NodeとCluster Elasticは本質的に分散型データベースであり、複数のサーバが協働して動作することを許可し、各サーバは複数のElasticインスタンスを実行することができる.単一のElasticインスタンスをノード(node)と呼びます.ノードのセットがクラスタを構成します.2.2 Index Elasticはすべてのフィールドをインデックスし、処理後に逆インデックス(Inverted Index)を書き込みます.データを検索するときは、インデックスを直接検索します.したがって,Elasticデータ管理の最上位単位をIndex(インデックス)と呼ぶ.これは、単一のデータベースの同義語です.各Index(データベース)の名前は小文字でなければなりません.次のコマンドは、現在のノードのすべてのIndexを表示します.
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
2.3 Document Index内の単一のレコードをDocument(ドキュメント)と呼びます.多くのDocumentがIndexを構成しています.DocumentはJSON形式で表されていますが、以下に例を示します.
{   "user": "  ",   "title": "   ",   "desc": "     " }
同じIndex内のDocumentは、同じ構造(scheme)は必要ありませんが、同じままであることが検索効率の向上に役立ちます.2.4 Type Documentはグループ化できます.例えばweatherというIndexでは、都市グループ(北京と上海)でも気候グループ(晴天と雨)でもいいです.このパケットはTypeと呼ばれ,Documentをフィルタリングするための仮想論理パケットである.異なるTypeには似たような構造(schema)があるはずです.例えば、idフィールドはこのグループでは文字列ではなく、別のグループでは数値ではありません.これは、リレーショナル・データベースのテーブルとの違いです.性質が全く異なるデータ(productsやlogsなど)は、1つのIndexの中の2つのタイプではなく、2つのIndexに保存する必要があります(できますが).次のコマンドは、各Indexに含まれるTypeをリストします.
$ curl 'localhost:9200/_mapping?pretty=true'
計画によると、Elastic 6.x版ではIndexごとにType,7を1つだけ含めることができる.x版はTypeを完全に削除します.三、Indexの新規作成と削除Indexの新規作成は、Elasticサーバに直接PUT要求を発行することができる.次の例はweatherというIndexを新規作成します.
$ curl -X PUT 'localhost:9200/weather'
サーバはJSONオブジェクトを返し、acknowledgedフィールドは操作に成功したことを示します.
{   "acknowledged":true,   "shards_acknowledged":true }
その後、このIndexを削除するためにDELETEリクエストを発行します.
$ curl -X DELETE 'localhost:9200/weather'
四、中国語分詞設定まず、中国語分詞プラグインをインストールします.ここではikを使用していますが、smartcnなどの他のプラグインも考えられます.
$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip
の上のコードは5.5.1版のプラグインをインストールして、Elastic 5.5.1と協力して使用します.次に、Elasticを再起動すると、この新しくインストールされたプラグインが自動的にロードされます.次に、Indexを新規作成し、分詞が必要なフィールドを指定します.このステップはデータ構造によって異なり、次のコマンドは本明細書のみです.基本的には、検索する中国語フィールドは、単独で設定します.
$ curl -X PUT 'localhost:9200/accounts' -d ' {   "mappings": {     "person": {       "properties": {         "user": {           "type": "text",           "analyzer": "ik_max_word",           "search_analyzer": "ik_max_word"         },         "title": {           "type": "text",           "analyzer": "ik_max_word",           "search_analyzer": "ik_max_word"         },         "desc": {           "type": "text",           "analyzer": "ik_max_word",           "search_analyzer": "ik_max_word"         }       }     }   } }'
上のコードでは、まずaccountsという名前のIndexを新規作成し、personという名前のTypeが入っています.personには3つのフィールドがあります.
  • user
  • title
  • desc

  • この3つのフィールドはすべて中国語で、タイプはすべてテキスト(text)なので、デフォルトの英語の分詞器は使用できない中国語の分詞器を指定する必要があります.Elasticの分詞器はanalyzerと呼ばれています.各フィールドに分詞器を指定します.
    "user": {   "type": "text",   "analyzer": "ik_max_word",   "search_analyzer": "ik_max_word" }
    上のコードでは、analyzerはフィールドテキストの分詞器であり、search_analyzerは検索語の分詞器です.ik_max_word分詞器はプラグインikから提供され、テキストを最大数の分詞することができます.五、データ操作5.1新規記録が指定された/index/TypeにPUT要求を送信すれば、Indexに記録を追加することができる.たとえば、/accounts/personにリクエストを送信すると、人員レコードを追加できます.
    $ curl -X PUT 'localhost:9200/accounts/person/1' -d ' {   "user": "  ",   "title": "   ",   "desc": "     " }'
    サーバが返すJSONオブジェクトには、Index、Type、Id、Versionなどの情報が与えられます.
    {   "_index":"accounts",   "_type":"person",   "_id":"1",   "_version":1,   "result":"created",   "_shards":{"total":2,"successful":1,"failed":0},   "created":true }
    よく見ると、リクエストパスは/accounts/person/1であり、最後の1はレコードのIdであることがわかります.数字とは限らず、abcなどの任意の文字列でも構いません.新規レコードの場合は、Idを指定せずにPOSTリクエストに変更することもできます.
    $ curl -X POST 'localhost:9200/accounts/person' -d ' {   "user": "  ",   "title": "   ",   "desc": "    " }'
    上のコードでは、/accounts/personにPOSTリクエストを発行し、レコードを追加します.このとき,サーバが返すJSONオブジェクトのうち,idフィールドはランダム文字列です.
    {   "_index":"accounts",   "_type":"person",   "_id":"AV3qGfrC6jMbsbXb6k1p",   "_version":1,   "result":"created",   "_shards":{"total":2,"successful":1,"failed":0},   "created":true }
    は、Index(この例ではaccounts)を先に作成しなければ、上記のコマンドを直接実行し、Elasticもエラーを報告せず、指定したIndexを直接生成することに注意している.だから、タイプを打つときはIndexの名前を間違えないように気をつけてください.5.2レビューレコードが/index/type/idにGET要求を発行すると、このレコードをレビューすることができます.
    $ curl 'localhost:9200/accounts/person/1?pretty=true'
    上のコードは/accounts/person/1のレコードの表示を要求し、URLのパラメータpretty=trueは読みやすいフォーマットで返されることを示す.返されたデータのfoundフィールドは、クエリが成功したことを示します.sourceフィールドは元のレコードを返します.
    {   "_index" : "accounts",   "_type" : "person",   "_id" : "1",   "_version" : 1,   "found" : true,   "_source" : {     "user" : "  ",     "title" : "   ",     "desc" : "     "   } }
    Idが正しくないとデータが調べられず、foundフィールドはfalseです.
    $ curl 'localhost:9200/weather/beijing/abc?pretty=true'  {   "_index" : "weather",   "_type" : "beijing",   "_id" : "abc",   "found" : false }
    5.3削除レコード削除レコードは、DELETE要求を発行します.
    $ curl -X DELETE 'localhost:9200/accounts/person/1'
    ここでは、このレコードを削除しないでください.後で使用します.5.4更新記録更新記録とは、PUT要求を用いて、一度データを再送信することである.
    $ curl -X PUT 'localhost:9200/accounts/person/1' -d ' {     "user" : "  ",     "title" : "   ",     "desc" : "     ,    " }'   {   "_index":"accounts",   "_type":"person",   "_id":"1",   "_version":2,   "result":"updated",   "_shards":{"total":2,"successful":1,"failed":0},   "created":false }
    上のコードでは、元のデータを「データベース管理」から「データベース管理、ソフトウェア開発」に変更しました.結果を返すと、いくつかのフィールドが変更されました.
    "_version" : 2, "result" : "updated", "created" : false
    では、レコードのIdは変わっていませんが、バージョン(version)は1から2に、操作タイプ(result)はcreatedからupdatedに、createdフィールドはfalseに変わります.今回は新規レコードではないからです.六、データ照会6.1はすべての記録を返してGET方法を使用して、直接要求/Index/Type/searchは、すべてのレコードを返します.
    $ curl 'localhost:9200/accounts/person/_search'  {   "took":2,   "timed_out":false,   "_shards":{"total":5,"successful":5,"failed":0},   "hits":{     "total":2,     "max_score":1.0,     "hits":[       {         "_index":"accounts",         "_type":"person",         "_id":"AV3qGfrC6jMbsbXb6k1p",         "_score":1.0,         "_source": {           "user": "  ",           "title": "   ",           "desc": "    "         }       },       {         "_index":"accounts",         "_type":"person",         "_id":"1",         "_score":1.0,         "_source": {           "user" : "  ",           "title" : "   ",           "desc" : "     ,    "         }       }     ]   } }
    上のコードでは、結果を返すtookフィールドは、操作の時間(ミリ秒単位)を表し、timed_outフィールドはタイムアウトの有無を表し、hitsフィールドはヒットの記録を表し、中のサブフィールドの意味は以下の通りである.
  • total:レコード数を返します.この例は2つです.
  • max_score:最も高いマッチング度合い、この例は1.0です.
  • hits:返されるレコードからなる配列.

  • 返されるレコードには、各レコードに1つの_があります.scoreフィールドは、一致するプログラムを表し、デフォルトではこのフィールドの降順に並べられています.6.2全文検索Elasticのクエリーは非常に特別で、独自のクエリー構文を使用して、GET要求にデータ体があることを要求します.
    $ curl 'localhost:9200/accounts/person/_search'  -d ' {   "query" : { "match" : { "desc" : "  " }} }'
    上のコードはMatchクエリを使用しており、指定された一致条件はdescフィールドに「ソフトウェア」という言葉が含まれていることです.結果は次のように返されます.
    {   "took":3,   "timed_out":false,   "_shards":{"total":5,"successful":5,"failed":0},   "hits":{     "total":1,     "max_score":0.28582606,     "hits":[       {         "_index":"accounts",         "_type":"person",         "_id":"1",         "_score":0.28582606,         "_source": {           "user" : "  ",           "title" : "   ",           "desc" : "     ,    "         }       }     ]   } }
    Elasticはデフォルトで10の結果を返し、sizeフィールドでこの設定を変更できます.
    $ curl 'localhost:9200/accounts/person/_search'  -d ' {   "query" : { "match" : { "desc" : "  " }},   "size": 1 }'
    上のコードで指定され、毎回1つの結果しか返されません.fromフィールドで、シフトを指定することもできます.
    $ curl 'localhost:9200/accounts/person/_search'  -d ' {   "query" : { "match" : { "desc" : "  " }},   "from": 1,   "size": 1 }'
    上のコードは、位置1から(デフォルトは位置0から)1つの結果のみを返すように指定しています.6.3論理演算複数の検索キーワードがある場合、Elasticはそれらがor関係であると考えている.
    $ curl 'localhost:9200/accounts/person/_search'  -d ' {   "query" : { "match" : { "desc" : "     " }} }'
    上のコードはソフトウェアorシステムを検索しています.複数のキーワードのand検索を実行する場合は、ブールクエリを使用する必要があります.
    $ curl 'localhost:9200/accounts/person/_search'  -d ' {   "query": {     "bool": {       "must": [         { "match": { "desc": "  " } },         { "match": { "desc": "  " } }       ]     }   } }'
    七、参考リンクElasticSearch公式マニュアルA Practical Introduction to Elasticsearch