プラクティスを解体「本当のElasticsearchするLuceneのフルテキスト検索から」|呉服

1、碑文

初期の2018年3月には、アイデアの開始:Elasticsearchへの技術書が解体を読んでやる関連は、アイデアが長い[ファン]ボードブッククラブ活況を呈している非コンピュータ業界に由来し、ブックに毎日を聞くことを得る、XXは、ヘルプブックを取り壊さように。

中国は現在市場に出回っている本について3つのES5.Xため、とても基本的なことをElasticsearch、いくつかの外国の翻訳があるが、「深い理解Elasticsearch」かなり古典ES1.X、2.Xバージョン、のためのものです。

本の解体の目的:

  • 1)知識のElasticsearchソート既存。
  • 2)サプリメントはElasticsearch知識の隅に引っ張ります。
  • 3)手でと「鶏の詰め込み」プロジェクト/製品の戦闘を避けるために、「復習」事前知識の増加埋蔵再び実際には、コードやコマンドラインアクションを打ちました。
  • 4)あなたの本質を学ぶための最速時間可能、節約あなたの貴重な時間を最大「ドライ」を

解釈は「Elasticsearchに戦闘からLuceneのフルテキスト検索」です。

2、ブックの概要

著者はCSDNブログ、最終的書物によると書かれた大学院インターンシップ中の中国科学アカデミーの八尾クライミング(90)のマスターです。

  • 1/4本の章はLucence関連する原則と実用を説明します。
  • 1/2の章では、基本的な概念を説明Elasticsearch:クラスタを取得すると、詳細な分類、集計分析を検索し、Java APIの。
  • Elasticsearchクラスタ管理、プロジェクトの戦闘、Hadoopの戦闘に1/4セクション。

投票の合計:

利点:

  • 1)Elasticsearchは、基本的な概念、基本原則をカバーします。
  • 2)2実用的なプロジェクトのシェアがあります。

短所:

  • 1)概念分類の一部だけであり、シーンのさまざまなカテゴリの異なる分類の違いを説明できません。
  • 2)特徴点の一部が不完全な、部分的な理論、技術的な知識ポイントの多くをカバーし、実際のアプリケーションは異なります。
  • 3)本に基づいElasticsearch5.4.0は、いくつかの特徴6.xはもはや適用を説明していません。

図3に示すように、コア知識ポイントカーディング

以下のDSLはElasticsearchV6.2.2バージョンによって試されます。

複数のドキュメントをフェッチ3.1 mgetは。

1GET test_index/test_type/_mget
2{
3  "docs":[
4  {"_id":1},
5  {"_id":3}
6  ]
7}

最小簡易版:

1GET test_index/test_type/_mget
2{
3  "ids":[1,3]
4}

3.2アップデートアップデート

- 追加、削除、フィールドを更新

1POST test_index/test_type/1
2{
3  "no":1,
4  "name":"奔驰X100",
5  "addr":"德国",
6  "price":1000000,
7  "tags" : ["red"]
8}

3.2.1フィールドを追加します。

「赤」に割り当てられた次の新しいフィールドタグを追加します。

1POST test_index/test_type/1/_update
2{
3  "script":"ctx._source.tags = \"red\""
4}

変更された結果:

1{
 2  "_index": "test_index",
 3  "_type": "test_type",
 4  "_id": "1",
 5  "_version": 6,
 6  "found": true,
 7  "_source": {
 8  "no": 1,
 9  "name": "奔驰X100",
10  "addr": "德国",
11  "price": 1000000,
12  "tags": "red"
13  }
14}

3.2.2 [削除]フィールド

1POST test_index/test_type/1/_update
2{
3  "script":"ctx._source.remove(\"new_field\")"
4}

3.2.3アップデートフィールド - 追加

 1POST test_index/test_type/1/_update
 2{
 3  "script" : {
 4  "source": "ctx._source.tags.add(params.tag)",
 5  "lang": "painless",
 6  "params" : {
 7  "tag" : "blue"
 8  }
 9  }
10}

次のような結果を更新した後、次のとおりです。

1{
 2  "_index": "test_index",
 3  "_type": "test_type",
 4  "_id": "1",
 5  "_version": 8,
 6  "found": true,
 7  "_source": {
 8  "no": 1,
 9  "name": "奔驰X100",
10  "addr": "德国",
11  "price": 1000000,
12  "tags": [
13  "red",
14  "blue"
15  ]
16  }
17}

3.2.4削除フィールド(決意場合)

 1POST test_index/test_type/1/_update
 2{
 3  "script" : {
 4  "source": "if (ctx._source.tags.contains(params.tag)) { ctx.op = 'delete' } else { ctx.op = 'none' }",
 5  "lang": "painless",
 6  "params" : {
 7  "tag" : "red"
 8  }
 9  }
10}

要求された3.3大量ノート

  1. 各行の終わりに改行が効果的に各行を分離することができ、最後の行が持つべき、「\ n」は改行文字を持っている必要があります。
  2. ファイルの注意提出のサイズは、全体のバッチ要求がメモリノードの要求にロードする必要があり、要求が大きい場合には、他の要求に利用できる少ないメモリ。
  3. リクエストのベストバルクサイズは、ドキュメントとインデックスと検索サーバーのハードウェアの負荷、サイズと複雑さに完全に依存します。

3.4同時変更は、文書の問題の競合バージョンにつながります

以下は、地域社会の問題であり、私はより多くの関連知識のポイントだと思います。

シーンラインは個々 VersionConflictEngineException結果として同じ秒同時変更は、異常になる文書であるかもしれない、私は推測するリクエストの実行や低速の実行のバージョン番号を取得するよりも、リクエストのバージョン番号を取得することができるアップサート同時要求があります後半、発生する
すべての後に、デフォルトESはドキュメントの操作をロックしていません。しかし、それはロック機構の場合にはないとして、この問題に対処します。

ソリューション(仮):

ESバージョン管理は、内部と外部の両方のタイプがあります。デフォルトでは、内部使用のバージョン管理をES。

version_type =外部値ときに、外部制御。外部バージョンタイプを使用する場合、
システムは、リクエストに送信されるバージョン番号は、文書の現在格納されているバージョンのインデックスが、より大きいかどうかをチェックし
、それが真であれば、ドキュメントは新しいバージョン番号を使用して索引付けされます。

オファーの値は、ドキュメントのバージョン番号が格納されている以下に等しい場合、バージョンの競合が発生し、インデックス操作は失敗します。

1PUT /test_index/test_type/10?version=1520834740000&version_type=external
2{
3  "newadd":11,
4  "test":"true"
5}

リターンの結果:

 1{
 2  "_index": "test_index",
 3  "_type": "test_type",
 4  "_id": "10",
 5  "_version": 1520834740000,
 6  "found": true,
 7  "_source": {
 8  "newadd": 11,
 9  "test": "true"
10  }
11}

だから、それを達成するための最も簡単な方法は、バージョン番号として現在のタイムスタンプが== ==たびに更新され、

3.5動的および静的マッピングマッピング区別

  1. ダイナミックマッピングは:と呼ばれ、自動的にフィールドの種類を認識して書かれた文書、ES:動的マッピングを。
  2. 静的マッピング:データを書き込む前に、マニュアルセットのフィールド属性。

3.6テキストフィールドの特殊性

  1. ソートは(termsAggrions除き、将来のバージョンでは完全にテキストタイプの重合操作を禁止します)、めったに使われない重合を使用していません。

  2. 余談:あなたはマルチフィールド:.キーワードタイプを利用することができ、それを使用する必要がある場合。

  3. 公式サイトを読みます:

    http://t.cn/R6jy9Z3,http://t.cn/RnKU4tG

データ・ストレージ・勧告の3.7タイプ

数値フィールドの場合は、ニーズの場合には、可能な限り数値型の小さな範囲を選択します。

3.8と検索のフィルタリングの違い

  1. フィルタ:文書のみフィルタ条件に応じて、スコアを数えていません。
  2. 検索:問題は、関連度です。

ユーザーがクエリを入力すると、Elasticsearchは文書とほとんどがユーザーに関連する文書を返すようにしたいスコアに従ってソートされたモデルによってソートされたクエリキーワード間の相関を計算します。
eは
洗練:Elasticsearch転置インデックスにクエリキーワードを受け取った後、転置インデックスは最終的に返される検索、キーワードに該当する文書のコレクションを見つけ、その後、スコアを行うには、レコードのテーブルを投稿ソート、プロセスを強調することによって維持しますユーザーに結果。

注意:ESは、関連クエリやドキュメント、スコアを降順にソートデフォルトでソートされます。

3.9重い検索フィールドを指定する権利

1GET _search
2{
3  "query":{
4    "multi_match": {
5      "query": "美国",
6      "fields": ["addr^5", "name"]
7    }
8  }
9}

フィールドに3.10復帰少なくとも一つの文書制御されていません。

1GET _search
2{
3  "query":{
4    "exists":{
5      "field":"name"
6    }
7  }
8}

3.11は、固定されたスコアを取得します

 1GET /_search
 2{
 3    "query": {
 4        "constant_score" : {
 5            "filter" : {
 6                "term" : { "addr.keyword" : "美国"}
 7            },
 8            "boost" : 1.2
 9        }
10    }
11}

リターンの結果:

1{
 2  "took": 1,
 3  "timed_out": false,
 4  "_shards": {
 5    "total": 32,
 6    "successful": 32,
 7    "skipped": 0,
 8    "failed": 0
 9  },
10  "hits": {
11    "total": 3,
12    "max_score": 1.2,
13    "hits": [
14      {
15        "_index": "test_index",
16        "_type": "test_type",
17        "_id": "5",
18        "_score": 1.2,
19        "_source": {
20          "no": 5,
21          "name": "福特500",
22          "addr": "美国",
23          "price": 180000
24        }
25      },
26      {
27        "_index": "test_index",
28        "_type": "test_type",
29        "_id": "6",
30        "_score": 1.2,
31        "_source": {
32          "no": 6,
33          "name": null,
34          "addr": "美国",
35          "price": 180000
36        }
37      },
38      {
39        "_index": "test_index",
40        "_type": "test_type",
41        "_id": "3",
42        "_score": 1.2,
43        "_source": {
44          "no": 3,
45          "name": "福特300",
46          "addr": "美国",
47          "price": 300000
48        }
49      }
50    ]
51  }
52}

3.12は、文書検索スコアを変更します

:機能スコアクエリを達成。

3.13は、同様の記事を取得します

1{
 2  "query": {
 3    "more_like_this": {
 4      "fields": [
 5        "title"
 6      ],
 7      "like": "新时代的领路人",
 8      "min_term_freq": 1,
 9      "max_query_terms": 12
10    }
11  },
12  "_source": "title",
13  "from": 1000,
14  "size": 5
15}

3.14スクリプトを取得

以下は、6.xの検証です。
5.Xバージョンは、インラインにソースすべきです。

1POST test_index/_search
 2{
 3  "query":{
 4    "bool":{
 5      "must":{
 6         "script":{
 7        "script":{
 8          "source": "doc['price'].value > 100000",
 9     "lang":"painless"
10        }
11         }
12      }
13    }
14  }
15}

以上の3.15フィールドが強調表示されています

ハイライトフィールドは、すでに精通しているシーンがあります:タイトル、内容、それを行う方法ABSTR:私はタイトルのフィールドを検索すると、私はハイライトを期待しますか?

人気の話:
フィールドを検索しないで、偶然に、フィールドを強調表示することができます。

 1POST test_index/test_type/_search
 2{
 3  "query":{
 4    "match_phrase":{
 5      "addr":"美国"
 6    }
 7  },
 8  "highlight": {
 9    "require_field_match":false,
10      "fields":{
11        "addr":{"pre_tags":["<strong>"],
12          "post_tags":["</strong>"]
13        },
14        "name":{"pre_tags":["<strong>"],
15          "post_tags":["</strong>"]}
16      }
17  }
18}
1{
 2  "took": 116,
 3  "timed_out": false,
 4  "_shards": {
 5    "total": 5,
 6    "successful": 5,
 7    "skipped": 0,
 8    "failed": 0
 9  },
10  "hits": {
11    "total": 3,
12    "max_score": 1.1143606,
13    "hits": [
14      {
15        "_index": "test_index",
16        "_type": "test_type",
17        "_id": "6",
18        "_score": 1.1143606,
19        "_source": {
20          "no": 6,
21          "name": "大片美国",
22          "addr": "美国",
23          "price": 180000
24        },
25        "highlight": {
26          "name": [
27            "大片<strong>美</strong><strong>国</strong>"
28          ],
29          "addr": [
30            "<strong>美</strong><strong>国</strong>"
31          ]
32        }
33      },
34      {
35        "_index": "test_index",
36        "_type": "test_type",
37        "_id": "5",
38        "_score": 0.5753642,
39        "_source": {
40          "no": 5,
41          "name": "福特500",
42          "addr": "美国",
43          "price": 180000
44        },
45        "highlight": {
46          "addr": [
47            "<strong>美</strong><strong>国</strong>"
48          ]
49        }
50      },
51      {
52        "_index": "test_index",
53        "_type": "test_type",
54        "_id": "3",
55        "_score": 0.5753642,
56        "_source": {
57          "no": 3,
58          "name": "福特300",
59          "addr": "美国",
60          "price": 300000
61        },
62        "highlight": {
63          "addr": [
64            "<strong>美</strong><strong>国</strong>"
65          ]
66        }
67      }
68    ]
69  }
70}

3.16フラグメンテーションは、評価に影響を与えます

BM25は、代わりに選択TF-IDFベクトル空間モデルに基づいて、デフォルトのスコアリングモデルを使用してテキストのフィールドの5.4 Elasitcsearchタイプ後、類似度モデルパラメータは、マップに表示することができます。

なお:ES各スライスで個別に得点、スライスの数は、スコアリングの結果に影響を与えることができます。

次のようにこの問題はかなり興味深い議論です:
https://elasticsearch.cn/question/2275

3.17クラスタ統計

二つの情報の統計クラスター:

A:インデックスレベル

  • 断片、ストレージサイズ、メモリ使用量の数。

2:ノードレベル

  • 例えば、Xパックのようなノードの数、ノード、オペレーティング・システム、JVMのバージョン、メモリ、CPU、プラグイン情報。
1GET  /_cluster/stats

4、コアツールを推奨

工欲善其事必先利其器、良いツールは、開発効率を向上させることができます。

4.1ルークツール

1、特徴:

開発や診断を容易にするためのGUIツールのLuncene、Solrの、Elasitcsearchインデックスを表示します。

図2に示すように、コア機能:

  • コンテンツ解析フィールドを見ます。
  • 蘇検索インデックス。
  • インデックスのメンテナンスを行います。
  • HDFSからインデックスを読み込みます。
  • XML形式としてエクスポートインデックスの全部または一部を変換します。
  • テストカスタムのLuceneワードブレーカー。

3、ツール住所:
https://github.com/DmitryKey/luke

4、最新バージョン

5、に注意を払う
一貫してLuceneのようにルークのバージョン。

4.2ティカツール

1.はじめに

アパッチティカは、テキスト検出およびファイルの内容を抽出するためのライブラリです。

2.特長

ティカは、PPT、PDF、DOC、XLSなどの文書の異なるタイプの1000以上の種類を検出することができ、文書のすべての種類は、シンプルなインターフェイスで解決することができます。

3.アプリケーション

ティカは広く、検索エンジン、コンテンツ分析、テキスト翻訳、デジタル管理を使用していました。

4、ダウンロード
http://tika.apache.org/download.htmを

5、拡張子

あなたは、フルテキスト検索可能なナレッジベースのプロジェクトを持っている場合は、ドキュメントの解析のための文書の異なる種類のさまざまなティカを使用することを検討してください。

5.まとめ

これは、最初の本の解体で、コア知識ポイントは公式サイトのドキュメントは英語で、より詳細な解釈を持っているElasticsearch、前に私が言ったことを確認しました。

現在、すべての知識ポイントをカバーし、市場には何本ありません。

この本の目的は、学習と蓄積の練習のいくつかは、より多くの知識をまとめた要約、練習の練習、に依存する必要がほとんどです。

そしてお互いを奨励する「の書き込みは、と考える方が良いです」!一緒に来て!

次の本の神経の並べ替え... ..

推奨読書:

研究ノートの「Javaメモリモデルの深い理解」

インタビュー - 基本

春ブーツ2.0への移行ガイド

ドッカー迅速な展開プロジェクトを使用SpringBoot

なぜあなたは春のJavaフレームワークとして選んだのですか?

SpringBoot RocketMQの使用及びモニタリングの統合

春の10個の質問ブートインタビュー

Springフレームワークを作ることが多いトップ10の間違いを使用します

SpringBoot管理ガイド

SpringBootカフカは、使用を統合しました

SpringBoot RabbitMQの統合利用

Elasticsearch率増分の統計情報と電子メールの実現のタイミング

パートI良いのテキスト:

時間のためのスペースが必要なとき、|本物Elasticsearch!

おすすめ

転載: www.cnblogs.com/springforall/p/11334550.html