Elasticsearch学習ノート上級編(一)-ケースでterm filterを実戦で使用してデータを検索
13419 ワード
以下、IT技術フォーラムを事例として
出力:
注意:初歩的には、es全体がjson documentフォーマットをサポートしているため、拡張性と柔軟性が非常に良いと言えます.その後、ビジネスニーズが増加するにつれてdocumentでより多くのfieldを追加する場合は、いつでもfieldを追加することができます.しかし、mysqlなどのリレーショナル・データベースでテーブルを作成し、テーブルにcolumnを追加すると、テーブル構造を複雑に変更する構文で実行する必要があります.また、システムコードにも一定の影響がある可能性があります.
出力:
term filter/query:検索テキストに単語を区別せず、逆インデックスに直接持って行ってマッチングし、何を入力したのか、何をマッチングします.
出力:
出力:
出力:
keywordを使わなければ
出力:
articleID.keywordはESの最新バージョンに内蔵されているfieldで、分詞されていないので、articleIDが来ると2回インデックスが作成されます.1回は自分の本省で、分詞され、分詞後に逆インデックスが挿入され、もう1回はarticleIDに基づいています.keywordは単語を区別せず、最大256文字を保持し、直接1つの文字列を逆インデックスに挿入します.実際に使用する場合、type=keywordを手動で指定する必要がある場合は、デフォルト保持256文字の自動作成を回避できます.
出力:
デフォルトの分詞のtextタイプのfieldは、逆インデックスを作成すると、すべてのarticleIDに分詞し、分詞後、元のarticleIDがなくなり、その後分詞後の各wordが逆インデックスに存在する.
出力:
(1)term filter:exact valueに基づいて検索します.数字、boolean、dateが天然サポート(2)textでインデックスを作成する必要がある場合はnotとして指定します.analyzed、term(3)はSQLの単一where条件に相当する
1、ユーザーID、非表示かどうか、投稿ID、投稿日に基づいて投稿を検索する
(1)いくつかのテスト投稿のデータを挿入する
POST /forum/_bulk
{"index": {"_id": 1}}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
{"index": {"_id": 3}}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }
出力:
{
"took" : 269,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "forum",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 201
}
},
{
"index" : {
"_index" : "forum",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1,
"status" : 201
}
},
{
"index" : {
"_index" : "forum",
"_type" : "_doc",
"_id" : "3",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1,
"status" : 201
}
},
{
"index" : {
"_index" : "forum",
"_type" : "_doc",
"_id" : "4",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1,
"status" : 201
}
}
]
}
注意:初歩的には、es全体がjson documentフォーマットをサポートしているため、拡張性と柔軟性が非常に良いと言えます.その後、ビジネスニーズが増加するにつれてdocumentでより多くのfieldを追加する場合は、いつでもfieldを追加することができます.しかし、mysqlなどのリレーショナル・データベースでテーブルを作成し、テーブルにcolumnを追加すると、テーブル構造を複雑に変更する構文で実行する必要があります.また、システムコードにも一定の影響がある可能性があります.
(2)ユーザIDによる投稿の検索
GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"userID": 1
}
}
}
}
}
出力:
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"articleID" : "XHDK-A-1293-#fJ3",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-01"
}
},
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"articleID" : "KDKE-B-9947-#kL5",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-02"
}
}
]
}
}
term filter/query:検索テキストに単語を区別せず、逆インデックスに直接持って行ってマッチングし、何を入力したのか、何をマッチングします.
(3)非表示の投稿の検索
GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"hidden": false
}
}
}
}
}
出力:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"articleID" : "XHDK-A-1293-#fJ3",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-01"
}
},
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"articleID" : "KDKE-B-9947-#kL5",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-02"
}
},
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"articleID" : "JODL-X-1937-#pV7",
"userID" : 2,
"hidden" : false,
"postDate" : "2017-01-01"
}
}
]
}
}
(4)投稿日による投稿検索
GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"postDate": "2017-01-01"
}
}
}
}
}
出力:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"articleID" : "XHDK-A-1293-#fJ3",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-01"
}
},
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"articleID" : "JODL-X-1937-#pV7",
"userID" : 2,
"hidden" : false,
"postDate" : "2017-01-01"
}
}
]
}
}
(5)投稿IDによる投稿検索
GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"articleID.keyword": "XHDK-A-1293-#fJ3"
}
}
}
}
}
出力:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"articleID" : "XHDK-A-1293-#fJ3",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-01"
}
}
]
}
}
keywordを使わなければ
GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"articleID": "XHDK-A-1293-#fJ3"
}
}
}
}
}
出力:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
articleID.keywordはESの最新バージョンに内蔵されているfieldで、分詞されていないので、articleIDが来ると2回インデックスが作成されます.1回は自分の本省で、分詞され、分詞後に逆インデックスが挿入され、もう1回はarticleIDに基づいています.keywordは単語を区別せず、最大256文字を保持し、直接1つの文字列を逆インデックスに挿入します.実際に使用する場合、type=keywordを手動で指定する必要がある場合は、デフォルト保持256文字の自動作成を回避できます.
(6)分詞の表示
GET /forum/_analyze
{
"field": "articleID",
"text": ["XHDK-A-1293-#fJ3"]
}
出力:
{
"tokens" : [
{
"token" : "xhdk",
"start_offset" : 0,
"end_offset" : 4,
"type" : "",
"position" : 0
},
{
"token" : "a",
"start_offset" : 5,
"end_offset" : 6,
"type" : "",
"position" : 1
},
{
"token" : "1293",
"start_offset" : 7,
"end_offset" : 11,
"type" : "",
"position" : 2
},
{
"token" : "fj3",
"start_offset" : 13,
"end_offset" : 16,
"type" : "",
"position" : 3
}
]
}
デフォルトの分詞のtextタイプのfieldは、逆インデックスを作成すると、すべてのarticleIDに分詞し、分詞後、元のarticleIDがなくなり、その後分詞後の各wordが逆インデックスに存在する.
(7)インデックスの再構築
DELETE /forum
PUT /forum
{
"mappings": {
"properties": {
"articleID": {
"type": "keyword"
}
}
}
}
POST /forum/_bulk
{ "index": { "_id": 1 }}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
{ "index": { "_id": 3 }}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }
(8)投稿IDと投稿日に基づいて検索を再開
GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"articleID": "XHDK-A-1293-#fJ3"
}
}
}
}
}
出力:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "forum",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"articleID" : "XHDK-A-1293-#fJ3",
"userID" : 1,
"hidden" : false,
"postDate" : "2017-01-01"
}
}
]
}
}
2、まとめ
(1)term filter:exact valueに基づいて検索します.数字、boolean、dateが天然サポート(2)textでインデックスを作成する必要がある場合はnotとして指定します.analyzed、term(3)はSQLの単一where条件に相当する
select * from forum where articleID = 'XHDK-A-1293-#fJ3'