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
- 基本的なデータ型:
- 日付: 日付クラス
- 配列: 配列型
- オブジェクト: オブジェクト
- 文字列型は2種類に分かれる
- 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_match
match と似ていますが、複数のフィールドでクエリを実行できる点が異なります。
リクエストの取得: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) 結合クエリ
bool
must
(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ではクエリ内容のキーワード部分にラベルやスタイル(強調表示)を設定することができます。クエリの使用中にmatch
、highlight
属性を追加します。
- 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
集約。特定のフィールドのcount
、max
、min
、avg
およびsum
5 つのインジケーターを一度に返します。
{
"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);