elasticsearch: http および Java 呼び出しの詳細な説明

記事ディレクトリ

1 HTTP オペレーション

1.1 インデックス操作

1.1.1インデックスの作成

リクエストを入れる:http:// 127.0.0.1:9200/shopping

1.1.2 すべてのインデックスを表示する

リクエストを取得: http:// 127.0.0.1:9200/_cat/indices?v

ヘッダ 意味
健康 現在のサーバーの健全性ステータス: 緑 (クラスターは完了) 黄 (単一ポイントは正常、クラスターは不完全) 赤 (単一ポイントは異常)
状態 インデックスのオープンまたはクローズのステータス
索引 インデックス名
uuid インデックス統一番号
プライマリシャードの数
担当者 部数
docs.count 利用可能な文書の数
ドキュメント.削除されました 文書削除ステータス(トゥームストーン)
店舗サイズ プライマリ シャードとセカンダリ シャードが占める全体のスペース
pri.store.サイズ プライマリシャードが占めるスペース

1.1.3 単一のインデックスを表示する

リクエストを取得: http://127.0.0.1:9200/shopping

1.1.4 インデックスの削除

削除リクエスト: http://127.0.0.1:9200/shopping

1.2 文書操作

1.2.1 ドキュメントの作成

投稿リクエスト: http://127.0.0.1:9200/shopping/_doc
リクエスト本文:

{
    
    
  "title":"小米手机","category":"小米",         
  "images":"http://www.gulixueyuan.com/xm.jpg", 
  "price":3999.00
}

上記のデータを作成した後、データの一意の識別子 (ID) が指定されていないため、ES サーバーはデフォルトでランダムに ID を生成します。
一意の識別子をカスタマイズする場合は、作成時にそれを指定する必要があります。http:// 127.0.0.1:9200/shopping/_doc/1

1.2.2 ドキュメントを表示する

リクエストの取得: http:// 127.0.0.1:9200/shopping/_doc/1
結果を返す:

{
    
    
  "_index" 【索引】 : "shopping",
  "_type" 【文档类型】 : "_doc",
  "_id": "1",
  "_version": 2,
  "_seq_no": 2,
  "_primary_term": 2,
  "found" 【查询结果】 : true, # true 表示查找到, false 表示未查找到
  "_source" 【文档源信息】 : {
    
    
    "title": "华为手机",
    "category": "华为",
    "images": "http://www.gulixueyuan.com/hw.jpg",
    "price": 4999.00
  }
}

1.2.3 ドキュメントの変更

投稿リクエスト: http:// 127.0.0.1:9200/shopping/_doc/1
リクエスト本文:

{
    
    
  "title":"华为手机",
  "category":"华为",
  "images":"http://www.gulixueyuan.com/hw.jpg",
  "price":4999.00
}

変更が成功した後の応答:

{
    
    
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version" 【版本】 : 2,
  "result" 【结果】 : "updated", # updated 表示数据被更新
  "_shards": {
    
    
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 2
}

1.2.4 フィールドの変更

投稿リクエスト: http://127.0.0.1:9200/shopping/_update/1
リクエスト本文:

{
    
    
  "doc": {
    
    
      "price":3000.00
  }
}

1.2.5 文書の削除

削除リクエスト: http://127.0.0.1:9200/shopping/_doc/1
削除成功の応答:

{
    
    
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version" 【版本】    : 4, #对数据的操作,都会更新版本
  "result" 【结果】 :    "deleted", # deleted 表示数据被标记为删除
  "_shards": {
    
    
  "total": 2,
  "successful": 1,
  "failed": 0
  },
  "_seq_no": 4,
  "_primary_term": 2
} 

存在しないドキュメントを削除すると、次の結果が返されます。

{
    
    
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "result" 【结果】 : "not_found", # not_found 表示未查找到
  "_shards": {
    
    
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no":
  "_primary_term": 2
}

1.2.6 文書の条件付き削除

通常、データは文書の一意の識別子に基づいて削除されますが、実際の運用では条件に基づいて複数のデータを削除することも可能です
Post request: http://127.0.0.1:9200/shopping/_delete_by_query
リクエストボディ:

{
    
    
  "query":{
    
    
    "match":{
    
    
      "price":4000.00
    }
  }
}

削除が成功した後の応答結果:

{
    
    
  "took"【耗时】 : 175,
  "timed_out"【是否超时】 : false,
  "total"【总数】 : 2,
  "deleted"【删除数量】 : 2,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    
    
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1.0,
  "throttled_until_millis": 0,
  "failures": []
}

1.3 マッピング操作

データベース テーブルを作成するには、フィールド名、タイプ、長さ、制約などを設定する必要があります。インデックス ライブラリについても同様です。どのフィールドがこのタイプに属し、各フィールドにどのような制約情報があるかを知る必要があります。これはマッピングと呼ばれます。

1.3.1 マッピングの作成

put リクエスト: http://127.0.0.1:9200/student/_mapping
リクエスト本文:

{
    
    
  "properties": {
    
    
    "name":{
    
    
    "type": "text",
    "index": true
    },
    "sex":{
    
    
      "type": "text",
      "index": false
    },
    "age":{
    
    
      "type": "long",
      "index": false
    }
  }
}

マッピングデータの説明:

  • フィールド名:必要なものを入力し、以下の多くの属性を指定します。例:title 、subtitle 、images 、price
  • type: Type、Elasticsearch でサポートされているデータ型は非常に豊富です。主なデータ型をいくつか紹介します。
    • 文字列型は2種類に分かれる
      • テキスト: 分離可能な単語
      • キーワード: 単語に分割することはできません。データは完全なフィールドとして照合されます。
    • 数値: 2 つのカテゴリに分けられる数値タイプ
      • 基本的なデータ型:long 、integer、short 、byte 、double、float 、half_float
      • 浮動小数点数用高精度型scaled_float
    • 日付: 日付クラス
    • 配列: 配列型
    • オブジェクト: オブジェクト
  • Index : インデックスを付けるかどうか。デフォルトは true です。これは、構成を行わずにすべてのフィールドにインデックスが付けられることを意味します。
    • true : フィールドにはインデックスが付けられ、検索に使用できます。
    • false : フィールドにはインデックスが付けられず、検索できません。
  • store : データを独立して保存するかどうか。デフォルトは false です。

元のテキストは _source に保存されます。デフォルトでは、他の抽出フィールドは独立して保存されず、_source から抽出されます。もちろん、フィールドを独立して保存することもできます。「store」: true を設定するだけです。独立して保存されたフィールドの取得は、_source から解析するよりもはるかに高速ですが、より多くのスペースを消費するため、次に従って決定する必要があります。ビジネスニーズに応じて設定します。

  • アナライザー: 単語セグメンター、ik_max_word ここでの ik 単語セグメンターの使用を意味します。

1.3.2 ビューマッピング

リクエストの取得:http://127.0.0.1:9200/student/_mapping

1.3.3 インデックスマッピングの関連付け

リクエストを入れる:http:// 127.0.0.1:9200/student1

{
    
    
  "settings": {
    
    },
  "mappings": {
    
    
    "properties": {
    
    
      "name":{
    
    
      "type": "text",
      "index": true
    },
    "sex":{
    
    
      "type": "text",
      "index": false
    },
    "age":{
    
    
      "type": "long",
      "index": false
    }
    }
  }
} 

1.3.4 高度なクエリ

1) すべてのドキュメントをクエリする

リクエストの取得:http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "match_all": {
    
    }
  }
}
  • query: ここでのクエリはクエリ オブジェクトを表しており、さまざまなクエリ属性を持つことができます。
  • match_all: クエリ タイプ。例: match_all (すべてをクエリすることを表します)、一致、用語、範囲など。
  • {クエリ条件}: クエリ条件は、さまざまなタイプと記述方法に基づいて
    結果を返します。
{
    
    
  "took 【查询花费时间,单位毫秒】 " : 1116,
  "timed_out 【是否超时】 " : false,
  "_shards 【分片信息】 " : {
    
    
    "total 【总数】 " : 1,
    "successful 【成功】 " : 1,
    "skipped 【忽略】 " : 0,
    "failed 【失败】 " : 0
  },
  "hits 【搜索命中结果】 " : {
    
    
  "total" 【搜索条件匹配的文档总数】 : {
    
    
    "value" 【总命中计数的值】 : 3,
    "relation" 【计数规则】 : "eq" # eq 表示计数准确,  gte 表示计数不准确
  },
  "max_score 【匹配度分值】 " : 1.0,
  "hits 【命中结果集合】 " : [
    ......
    }
  ]
  }
}

2) 照合クエリ

一致一致型クエリはクエリ条件を単語に分割してクエリします 複数のエントリ間に or 関係があります
取得リクエスト:http:// 127.0.0.1:9200/student/_search
リクエストボディ :

{
    
    
"query": {
    
    
  "match": {
    
    
    "name":"zhangsan"
    }
  }
}

3) フィールド一致クエリ

multi_matchmatch と似ていますが、複数のフィールドでクエリを実行できる点が異なります。
リクエストの取得:http:// 127.0.0.1:9200/student/_search
リクエスト本文:

{
    
    
"query": {
    
    
"multi_match": {
    
    
  "query": "zhangsan",
  "fields": ["name","nickname"]
  }
}

4) キーワードの正確なクエリ

termクエリ、正確なキーワード一致クエリ、クエリ条件の単語分割なし。
リクエストの取得:http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
    "term": {
    
    
    "name": {
    
    
      "value": "zhangsan"
      }
    }
  }
}

5) 複数のキーワードによる正確なクエリ

termsクエリはクエリという用語と同じですが、一致する複数の値を指定できます。
GETリクエスト:http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "terms": {
    
    
    "name": ["zhangsan","lisi"]
    }
  }
}

6) クエリフィールドを指定する

デフォルトでは、Elasticsearch はドキュメントに保存されている_sourceすべてのフィールドを検索結果として返します。一部のフィールドのみを取得したい場合は、 _source.GET
リクエストのフィルタリングを追加できます。http:// 127.0.0.1:9200/student/_search

{
    
    
  "_source": ["name","nickname"],
  "query": {
    
    
    "terms": {
    
    
      "nickname": ["zhangsan"]
      }
  }
} 

7) フィルターフィールド

次のものを渡すこともできます。

  • include : 表示するフィールドを指定します
  • excludes :
    GET リクエストで表示したくないフィールドを指定しますhttp:// 127.0.0.1:9200/student/_search
{
    
    
  "_source": {
    
    
  "includes": ["name","nickname"]
  },
  "query": {
    
    
    "terms": {
    
    
    "nickname": ["zhangsan"]
    }
  }
}

8) 結合クエリ

boolmust(must)、must_not(must not)、should( should not)
GET リクエストを介して他のさまざまなクエリを結合しますhttp:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
  "bool": {
    
    
    "must": [
      {
    
    
        "match": {
    
    
        	"name": "zhangsan"
        }
      }
      ],
      "must_not": [
        {
    
    
          "match": {
    
    
          	"age": "40"
        }
      }
      ],
      "should": [
        {
    
    
        "match": {
    
    
        	"sex": "男"
        }
      }
    ]
  }
}

9) 範囲クエリ

rangeクエリは、指定された間隔内にある数値または時間を検索します。範囲クエリでは次の文字が使用できます

オペレーター 説明する
GT より大きい>
ジーテ 以上 >=
それ < 未満
LTE <= 以下

リクエストの取得:http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "range": {
    
    
    "age": {
    
        
      "gte":    30,
      "lte":    35
      }
    }
  }
}

10) ファジークエリ

検索語に類似した単語を含むドキュメントを返します。
類似した用語を検索するために、ファジー クエリは、指定された編集距離内で検索用語の考えられるすべてのバリエーションまたは拡張のセットを作成します。その後、クエリは各展開の完全一致を返します。
GETリクエスト:http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
    "fuzzy": {
    
    
    "title": {
    
    
        "value": "zhangsan",
        "fuzziness": 2
      }
    }
  }
}

11) 単一フィールドの並べ替え

sortこれにより、さまざまなフィールドで並べ替えたり、順序による並べ替え方法を指定したりできます。desc 降順、asc 昇順。
GETリクエスト:http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "match": {
    
    
  "name":"zhangsan"
  }
  },
  "sort":    [{
    
    
  "age":    {
    
    
  "order":"desc"
  }
  }]
}

12) 複数フィールドのソート

age と _score を一緒に使用してクエリを実行し、一致する結果が最初に age で並べ替えられ、次に関連性スコア
GET requestで並べ替えられるとします。http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
    	"match_all": {
    
    }
  },
  "sort": [
    {
    
    
      "age": {
    
    
      	"order": "desc"
      }
    },
    {
    
    
      "_score":{
    
    
      	"order": "desc"
      }
    }
  ]
}

13) ハイライトクエリ

Elasticsearchではクエリ内容のキーワード部分にラベルやスタイル(強調表示)を設定することができます。クエリの使用中にmatchhighlight属性を追加します。

  • pre_tags : 事前タグ
  • post_tags : 投稿タグ
  • フィールド: 強調表示する必要があるフィールド
  • title : タイトル フィールドを強調表示する必要があることがここで宣言されています。後でこのフィールドに独自の構成を設定することも、空にすることもできます。

GETリクエスト:http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
"match": {
    
    
"name": "zhangsan"
}
},
"highlight": {
    
    
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields":    {
    
    
"name":    {
    
    }
}
}
}

14) ページングクエリ

from : 現在のページの開始インデックス。デフォルトでは 0 から始まります。from = (pageNum - 1) * size
size : 各ページに表示される
GET リクエストの数:http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
"match_all": {
    
    }
},
"sort": [
{
    
    
"age": {
    
    
"order": "desc"
}
}
],
"from":    0,
"size":    2
}

15) 集計クエリ

集計を使用すると、リレーショナル データベースと同様に、ES ドキュメントに対して統計分析を実行できますgroup by。もちろん、最大値、平均値など、他にも多くの集計があります。

  • フィールドの最大値を取得します max
{
    
    
"aggs":{
    
    
"max_age":{
    
    
"max":{
    
    "field":"age"}
}
},
"size":0
}
  • フィールドの合計
{
    
    
"aggs":{
    
    
"sum_age":{
    
    
"sum":{
    
    "field":"age"}
}
},
"size":0
}
  • フィールドの平均値
{
    
    
"aggs":{
    
    
"avg_age":{
    
    
"avg":{
    
    "field":"age"}
}
},
"size":0
}
  • フィールドの値を重複排除して合計数を取得します
{
    
    "aggs":{
    
    
"distinct_age":{
    
    
"cardinality":{
    
    "field":"age"}
}
},
"size":0
} 
  • 状態集約
    stats集約。特定のフィールドのcountmaxminavgおよびsum5 つのインジケーターを一度に返します。
{
    
    
"aggs":{
    
    
"stats_age":{
    
    
"stats":{
    
    "field":"age"}
}
},
"size":0
}

16) バケット集計クエリ

バケット合計は、SQL の group by ステートメントに相当します。

  • 統計の集計、グループ化
{
    
    
"aggs":{
    
    
"age_groupby":{
    
    
"terms":{
    
    "field":"age"}
}
},
"size":0
}
  • 用語グループの下に集計する
{
    
    
"aggs":{
    
    
"age_groupby":{
    
    
"terms":{
    
    "field":"age"}
}
},
"size":0
}

2. Java APIの操作

Elasticsearch ソフトウェアは Java 言語で開発されているため、Elasticsearch サービスには Java API を通じてアクセスすることもできます。

2.1 Maven アイテムの作成

pom ファイルを変更し、Maven の依存関係を追加します。

<dependencies>
    <dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.8.0</version>
    </dependency>
    <!-- elasticsearch 的客户端 -->
    <dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.8.0</version>
    </dependency>
    <!-- elasticsearch 依赖 2.x 的 log4j -->
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.2</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.2</version>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
    </dependency>
    <!-- junit 单元测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
    </dependencies>

2.1.1 クライアントオブジェクト

クラスを作成しcom.atguigu.es.test.Elasticsearch01_Client、コード内に Elasticsearch クライアント オブジェクトを作成します。

// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
...
// 关闭客户端连接
client.close();

2.1.2 インデックス操作

ES サーバーが正常に起動すると、Java API クライアント オブジェクトを通じて ES インデックスを操作できるようになります。

1) インデックスの作成

// 创建索引 - 请求对象
CreateIndexRequest request = new CreateIndexRequest("user");
// 发送请求,获取响应
CreateIndexResponse response = client.indices().create(request,
RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 响应状态
System.out.println("操作状态 = " + acknowledged);

2) クエリインデックス

// 查询索引 - 请求对象
GetIndexRequest request = new GetIndexRequest("user");
// 发送请求,获取响应
GetIndexResponse response = client.indices().get(request,
RequestOptions.DEFAULT);
System.out.println("aliases:"+response.getAliases());
System.out.println("mappings:"+response.getMappings());
System.out.println("settings:"+response.getSettings());

3) インデックスの削除

// 删除索引 - 请求对象
DeleteIndexRequest request = new DeleteIndexRequest("user");
// 发送请求,获取响应
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
// 操作结果
System.out.println("操作结果 :  " + response.isAcknowledged());

2.1.3 文書操作

1) 新しいドキュメントを追加する

データモデルの作成

class User {
    
    
    private String name;
    private Integer age;
    private String sex;
    public String getName() {
    
    
    return name;
    }
    public void setName(String name)
    this.name = name;
    }
    public Integer getAge() {
    
    
    
    return age;
    }
    public void    setAge(Integer age) {
    
    
    this.age    = age;
    }
    public String getSex() {
    
    
    return sex;
    }
    public void setSex(String sex) {
    
    
    this.sex = sex;
    }
    }

データを作成してドキュメントに追加する

// 新增文档 - 请求对象
IndexRequest request = new IndexRequest();
// 设置索引及唯一性标识
request.index("user").id("1001");
// 创建数据对象
User user = new User();
user.setName("zhangsan");
user.setAge(30);
user.setSex("男");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(user);
// 添加文档数据,数据格式为 JSON 格式
request.source(productJson,XContentType.JSON);
// 客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());

2) ドキュメントを変更する

// 修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 配置修改参数
request.index("user").id("1001");
// 设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "女");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());

3) 文書のクエリ

//1.创建请求对象
GetRequest request = new GetRequest().index("user").id("1001"); //2.客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT); 3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());

4)文書を削除する

//创建请求对象
DeleteRequest request = new DeleteRequest().index("user").id("1");
//客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); //打印信息
System.out.println(response.toString());

5) バッチ操作

//创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new
IndexRequest().index("user").id("1001").source(XContentType.JSON, "name",
"zhangsan"));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name",
"lisi"));
request.add(new
IndexRequest().index("user").id("1003").source(XContentType.JSON, "name",
"wangwu"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
  • 一括削除:
//创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT); //打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());

2.1.4 高度なクエリ

1) リクエスト本文のクエリ

  • すべてのインデックス データをクエリする
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.               ());
request.source(sourceBuilder);

SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
   //输出每条查询的结果信息
   System.out.println(hit.getSourceAsString());
}
  • 用語クエリ、クエリ条件はキーワードです
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.termQuery ("age", "30"));    request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT); // 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut());
System.out.println("total:" + hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • ページングクエリ
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分页查询
// 当前页其实索引 (第一条数据的顺序号),from
sourceBuilder.from(0);
// 每页显示多少条 size
sourceBuilder.size(2);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT); // 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut());
System.out.println("total:" + hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • データの並べ替え
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 排序
sourceBuilder.sort("age", SortOrder.ASC);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • フィルターフィールド
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");

// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());

//查询字段过滤
String[] excludes = {
    
    };
String[] includes = {
    
    "name", "age"};
sourceBuilder.fetchSource(includes, excludes);

request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • ブールクエリ
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");

// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含
boolQueryBuilder.must (QueryBuilders.matchQuery("age", "30"));
// 一定不含
boolQueryBuilder.mustNot (QueryBuilders.matchQuery("name", "zhangsan"));
// 可能包含
boolQueryBuilder.should (QueryBuilders.matchQuery("sex", "男"));

sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<<========");
  • 範囲クエリ
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 大于等于
rangeQuery.gte("30");
// 小于等于
rangeQuery.lte("40");
sourceBuilder.query(rangeQuery);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut());
System.out.println("total:" + hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<<========");
● 模糊查询
// 创建搜索请求对象
  SearchRequest request = new SearchRequest();
  request.indices("student");
  
  // 构建查询的请求体
  SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  
  sourceBuilder.query(QueryBuilders.fuzzyQuery("name","zhangsan").fuzziness(Fu
  zziness.ONE));
  request.source(sourceBuilder);
  SearchResponse response = client.search (request, RequestOptions.DEFAULT);
  // 查询匹配
  SearchHits hits = response.getHits();
  System.out.println("took:" + response.getTook());
  System.out.println("timeout:"    + response.isTimedOut());
  System.out.println("total:" +    hits.getTotalHits());
  System.out.println("MaxScore:" + hits.getMaxScore());
  System.out.println("hits========>>");
  for (SearchHit hit : hits) {
    
    
  //输出每条查询的结果信息
  System.out.println(hit.getSourceAsString());
  }

2) ハイライトクエリ

// 高亮查询
SearchRequest request = new SearchRequest().indices("student"); //2.创建查询请求体构建器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //构建查询方式:高亮查询
TermsQueryBuilder termsQueryBuilder =
QueryBuilders.termsQuery("name","zhangsan");
//设置查询方式
sourceBuilder.query(termsQueryBuilder);
//构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//设置标签前缀
highlightBuilder.postTags("</font>");//设置标签后缀
highlightBuilder.field("name");//设置高亮字段
//设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);
//设置请求体
request.source(sourceBuilder);
//3.客户端发送请求,获取响应对象
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
//4.打印响应结果
SearchHits hits = response.getHits();
System.out.println("took::"+response.getTook());
System.out.println("time_out::"+response.isTimedOut());
System.out.println("total::"+hits.getTotalHits());
System.out.println("max_score::"+hits.getMaxScore());
System.out.println("hits===>>");
for (SearchHit hit : hits) {
    
    
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
//打印高亮结果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println(highlightFields);
}

3) 集計クエリ

  • 最大年齢
// 高亮查询
SearchRequest request = new SearchRequest().indices("student");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
//设置请求体
request.source(sourceBuilder);
//3.客户端发送请求,获取响应对象
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
//4.打印响应结果
SearchHits hits = response.getHits();
System.out.println(response);
● 分组统计
// 高亮查询
SearchRequest request = new SearchRequest().indices("student");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("ag
e"));
//设置请求体
request.source(sourceBuilder);
//3.客户端发送请求,获取响应对象
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
//4.打印响应结果
SearchHits hits = response.getHits();
System.out.println(response);

おすすめ

転載: blog.csdn.net/qq_41943900/article/details/131529693