elasticsearch の基本概念と一般的なコマンド
エスの基本コンセプト
転置インデックス
逆インデックス: es の基本的な並べ替えには逆インデックスが使用され、キー (_id) は値によって検索されます。es にはインデックス領域とメタデータ領域の 2 つの領域があります。メタデータには完全な文書データが格納され、インデックス領域には数値が記録されます。インデックスの出現数と各フィールドの長さを計算してインデックス スコアを計算します。インデックス スコアは並べ替えられた結果を返すために使用されます。es ではフィールドごとに逆索引が確立されているため、フィールド用語をクエリするときにドキュメントの ID がわかり、対応するドキュメントをすばやく見つけることができます。
トークナイザー
分析: テキスト分析は、全文を一連の単語に変換するプロセスであり、単語分割 (アナライザー) とも呼ばれます。分析はアナライザーによって実行されます。単語の分割は、アナライザーを通じて文書を用語に分割することであり、各用語はその用語を含む文書を指します。
アナライザーの構成:文字フィルター(文字フィルター)、トークナイザー(トークナイザー)、トークンフィルター(トークンフィルター)
順序: 文字フィルター -> トークナイザー -> トークンフィルター
トークナイザー
ik_max_word: 最も詳細な単語の分割に従って
ik_smart: 最も粗い粒度に従った単語の分割
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国群众"
}
拡張語とストップワード
拡張単語: キーワードではないが、esで検索する際のキーワードとして使用したい単語も拡張辞書に追加できます。
ストップ ワード: 一部の単語はキーワードですが、ビジネス シナリオでの取得にこれらのキーワードを使用したくない場合は、これらの単語をストップ辞書に入れることができます。
拡張ワードを定義し、辞書を無効にするには、IK トークナイザーの config ディレクトリにあるファイル IKAnalyzer.cfg.xml を変更します。
1. 修改文件 vim IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopwords.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
2. vim ext_dict.dic 在ik分词器中目录下config目录创建ext_dict.dic文件,编码一定要为utf-8才能生效,然后在里面加入扩展词即可,
3. vim ext_stopwords.dic 在ik分词器中目录下config目录创建ext_stopwords.dic文件,编码一定要为utf-8才能生效,然后再里面加入停用词即可
4. 重启es生效
Esの基本操作
インデックスを表示する
GET _cat/indices?v
インデックスを作成する
PUT /orders
{
"settings": {
"number_of_shards": 1
, "number_of_replicas": 0
}
}
インデックスの削除
DELETE /orders
インデックスを作成し、関連するマッピングを作成する
注: インデックスのマッピングは変更および削除できません。インデックスを削除してマッピングを再作成することのみ可能です。
PUT /products
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "keyword"
},
"price":{
"type": "double"
},
"create_time":{
"type": "date"
},
"description":{
"type": "text"
}
}
}
}
インデックスのマッピングを表示する
GET /products/_mapping
文書を作成する
注: 指定した _id メソッドを使用すると、同じ ID が増加し、新しい ID が古いドキュメントを上書きします。
#指定_id
POST /products/_doc/1
{
"id": 1,
"name": "小苹果",
"price": 5.66,
"create_time": "2022-06-13",
"description": "小苹果正好吃"
}
文書を削除する
-
_idに基づいて削除
DELETE /products/_doc/1
ドキュメントを更新する
- put メソッドを使用し、最初に削除してから追加します。
PUT /products/_doc/1
{
"name": "小苹果2"
}
- post メソッドを使用して更新するフィールドを指定します
POST /products/_doc/1/_update
{
"doc":{
"id": 1,
"name": "小苹果",
"price": 5.66,
"create_time": "2022-06-13",
"description": "小苹果正好吃"
}
}
文書を表示する
-
_id に基づくクエリ
GET /products/_doc/1
ドキュメントのバッチ操作
バッチ操作はフォーマットできず、バッチ操作はアトミックではないため、エラーは他の操作に影響しません。
POST /products/_doc/_bulk
{"index":{"_id":2}}
{"id":2,"name":"macbook","price":9999,"create_time":"2022-06-13","description":"macbook正好用"}
{"index":{"_id":3}}
{"id":3,"name":"phone","price":5999,"create_time":"2022-06-13","description":"phone"}
POST /products/_doc/_bulk
{"index":{"_id":4}}
{"id":4,"name":"猪猪","price":9999,"create_time":"2022-06-13","description":"猪猪真好吃呀"}
{"update":{"_id":3}}
{"doc":{"name":"phone13"}}
{"delete":{"_id":2}}
高度なクエリ (QUERY-DSL)
インデックス付けされたすべてのドキュメントをクエリする
GET /products/_search
{
"query":{
"match_all": {}
}
}
タームクエリ指定フィールド
知らせ:
1. es のテキスト型のみ単語分割され、他の型は単語分割されません。
2. ES では標準のトークナイザーがデフォルトで使用されます。これは、中国語の場合は単語ごと、英語の場合は単語ごとです。
GET /products/_search
{
"query": {
"term": {
"description": {
"value": "good"
}
}
}
}
範囲範囲クエリ
range キーワード: 指定された範囲内のドキュメントをクエリするために使用されます
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 0,
"lte": 1000
}
}
}
}
プレフィックスプレフィックスクエリ
GET /products/_search
{
"query": {
"prefix": {
"name": {
"value": "小"
}
}
}
}
ワイルドカード ワイルドカード クエリ
ワイルドカード:? 1 つの任意の文字と一致するために使用され、* 複数の任意の文字と一致するために使用されます。
GET /products/_search
{
"query": {
"wildcard": {
"name": {
"value": "小*"
}
}
}
}
ID バッチクエリ ID
GET /products/_search
{
"query": {
"ids": {
"values": [1,3]
}
}
}
ファジーファジークエリ
注: ファジー ファジー クエリの最大ファジー エラーは 0 ~ 2 でなければなりません
- 検索キーワードの長さは 2 であり、曖昧さは許可されません
- 曖昧な検索を可能にするため、検索キーワードの長さは 3 ~ 5 です。
- 検索キーワードの長さが 5 を超えており、最大 2 つのブラーが許可されています
GET /products/_search
{
"query": {
"fuzzy": {
"name": {
"value": "小果果"
}
}
}
}
bool ブールクエリ
must:同時に成立する&&に相当
should: と同等||確立する
must_not: ! と同等です。どちらも満足できない
GET /products/_search
{
"query": {
"bool": {
"must_not": [
{
"ids": {
"values": [1,3]
}
},
{
"term": {
"name": {
"value": "小狗"
}
}
}
]
}
}
}
Multi_match 複数フィールド クエリ
注: フィールド タイプが単語分割されている場合は、クエリ条件が単語分割された後にフィールドをクエリします。
GET /products/_search
{
"query": {
"multi_match": {
"query": "好吃",
"fields": ["name","description"]
}
}
}
query_string デフォルトフィールドの単語セグメンテーションクエリ
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "好吃"
}
}
}
ハイライト ハイライトクエリ
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "好吃"
}
},
"highlight": {
"pre_tags": ["<span style='color:red;'>"],
"post_tags": ["</span>"],
"require_field_match": "false",
"fields": {
"*": {}
}
}
}
項目数の指定、クエリのページ分割、並べ替え、指定されたフィールドの返し
サイズ: デフォルトでは 10 個のアイテムが返されます
from: どの項目から戻るか: (現在のページ番号 - 1) * サイズ
sort: 指定されたフィールドを並べ替えます。
_source: は配列であり、配列内の指定されたフィールドを返します。
GET /products/_search
{
"query": {
"match_all": {}
},
"from": 1,
"size": 2,
"sort": [
{
"price": {
"order": "desc"
}
}
],
"_source": ["name","price"]
}
es フィルター クエリ (フィルター クエリ)
esのクエリ操作はクエリとフィルタの2種類に分かれます。
クエリ: デフォルトでは、各ドキュメントのスコアが計算され、スコアに従って並べ替えられます。
フィルター: 一致するドキュメントのみがフィルターで除外され、スコアは計算されず、ドキュメントはキャッシュされます。
したがって、パフォーマンスの観点から見ると、フィルタリングはクエリよりも高速です。フィルタリングは大規模なデータのフィルタリングに適しており、クエリはデータを正確に照合するのに適しています。一般的なアプリケーションでは、最初にフィルタリング操作を使用してデータをフィルタリングし、次にクエリを使用してデータを照合する必要があります。
注: クエリとフィルタを実行する場合は、最初にフィルタを実行してからクエリを実行します。
GET /products/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"exists": {
"field": "name"
}
}
]
}
}
}
esの集計クエリ
グループ化 (用語)
GET /products/_search
{
"query": {
"match_all": {}
},
"aggs": {
"price_group":{
"terms": {
"field": "price",
"size": 10
}
}
}
}
最大値(マックス)
GET /products/_search
{
"query": {
"match_all": {}
},
"aggs": {
"price_max": {
"max": {
"field": "price"
}
}
}
}
esクラスタ構築
知らせ:
- すべてのノードのクラスター名は一貫している必要があります:cluster.name
- 各ノードには一意の名前 (node.name) が必要です。
- 各ノードのリモート接続を開きます: network.host:0.0.0.0
- クラスターノード通信での IP アドレスの使用を指定します。 network.pulish_host;
- Web ポートの TCP ポート http.port:transport.tcp.port を変更します。
- クラスター内のすべてのノードの通信リストを指定します
- クラスターがマスターノードの数を初期化できるようにします
- クラスター内で使用可能なノードの最小数
- 各ノードのクロスドメイン アクセスを有効にする