Tablestore SDK for Go でワイルドカード検索を使用して、アスタリスク (*) および疑問符 (?) を用いて値またはトークンを照合します。
前提条件
Tablestore Go SDK をインストールし、クライアントを初期化します。
概要
ワイルドカード検索では、アスタリスク (*) を使用して 0 文字以上の任意の文字列に一致させ、疑問符 (?) を使用して 1 文字に一致させます。Text フィールドに対しては、トークン化された term に対して検索が適用されます。照合は大文字と小文字を区別し、クエリ文字列の長さは最大 32 文字です。
func (client *tablestore.TableStoreClient) Search(request *tablestore.SearchRequest) (*tablestore.SearchResponse, error)
次の例ではデータを検索し、最大 10 行と一致した行の総数を返します。
tableName := "example_table"
indexName := "example_index"
query := &search.WildcardQuery{FieldName: "category", Value: "book-*"}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10).
SetGetTotalCount(true)
response, err := client.Search(&tablestore.SearchRequest{
TableName: tableName,
IndexName: indexName,
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.TotalCount)
fmt.Println(response.Rows)
パラメーター
検索リクエスト
request は tablestore.SearchRequest 型であり、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
TableName (必須) |
string |
データテーブルの名前です。 |
|
IndexName (必須) |
string |
検索インデックスの名前。 |
|
SearchQuery (必須) |
search.SearchQuery |
検索条件および一般的な検索構成です。 |
|
ColumnsToGet (オプション) |
*tablestore.ColumnsToGet |
返却する列の構成です。このパラメーターを省略すると、プライマリキー列のみが返されます。 |
|
RoutingValues (オプション) |
[]*tablestore.PrimaryKey |
カスタムルーティングフィールドのプライマリキー値です。カスタムルーティングが設定されていない場合は、このパラメーターを省略します。 |
|
TimeoutMs (オプション) |
*int32 |
リクエストのタイムアウト期間(ミリ秒単位)です。 |
検索構成
search.NewSearchQuery() を呼び出して検索構成を作成し、以下のメソッドで構成します。
|
名前 |
型 |
説明 |
|
SetQuery (必須) |
search.Query |
検索条件を指定します。 |
|
SetOffset (オプション) |
int32 |
開始位置を指定します。デフォルト値は 0 です。オフセットベースのページネーションでは、Offset + Limit の合計が 100,000 を超えてはなりません。 |
|
SetLimit (オプション) |
int32 |
返却する最大行数を指定します。デフォルト値は 10、最大値は 100 です。0 を指定すると、行は返されません。 |
|
SetHighlight (オプション) |
*search.Highlight |
Text フィールドのサマリーおよびハイライトを構成します。詳細については、「サマリーおよびハイライト」をご参照ください。 |
|
SetCollapse (オプション) |
*search.Collapse |
検索結果を折りたたみます。詳細については、「検索結果の折りたたみ」をご参照ください。 |
|
SetSort (オプション) |
*search.Sort |
結果のソート順を指定します。詳細については、「結果のソートとページネーション」をご参照ください。 |
|
SetGetTotalCount (オプション) |
bool |
一致したすべての行をカウントするかどうかを指定します。デフォルト値は false です。 |
|
SetToken (オプション) |
[]byte |
前回の応答で返された NextToken 値を指定します。このメソッドは、トークンに前ページのソート条件が含まれているため、Sort をクリアします。トークンベースのページネーションを使用する場合は、Offset を指定しないでください。 |
|
SetSearchFilter (オプション) |
*search.SearchFilter |
検索後のフィルターを適用します。詳細については、「検索後のフィルターの使用」をご参照ください。 |
|
Aggregation (オプション) |
...search.Aggregation |
集約を構成します。詳細については、「集約」をご参照ください。 |
|
GroupBy (オプション) |
...search.GroupBy |
グループ化を構成します。詳細については、「集約」をご参照ください。 |
検索条件
検索条件は search.WildcardQuery 型であり、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
FieldName (必須) |
string |
検索対象のインデックスフィールド名です。 |
|
Value (必須) |
string |
ワイルドカード検索文字列です。最大 32 文字まで指定できます。 |
返却列
request.ColumnsToGet は tablestore.ColumnsToGet 型であり、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
Columns (オプション) |
[]string |
返却する属性列です。ReturnAll および ReturnAllFromIndex の両方が false の場合にのみ有効です。 |
|
ReturnAll (オプション) |
bool |
データテーブル内のすべての属性列を返すかどうかを指定します。デフォルト値は false です。 |
|
ReturnAllFromIndex (オプション) |
bool |
インデックスされたすべての属性列を返すかどうかを指定します。デフォルト値は false です。このパラメーターと ReturnAll を同時に true に設定しないでください。 |
応答
Search メソッドは tablestore.SearchResponse 値を返します。次の表は、主要なビジネスフィールドについて説明しています。
|
名前 |
型 |
説明 |
|
TotalCount |
int64 |
一致した行の総数です。この値は SetGetTotalCount の設定に依存します。 |
|
Rows |
[]*tablestore.Row |
現在の検索で返された行です。行数は SetLimit で指定された値を超えることはありません。 |
|
SearchHits |
[]*tablestore.SearchHit |
検索ヒットです。ハイライト、ネストされた inner hits、または関連スコアを使用する場合は、このフィールドを読み取ります。 |
|
NextToken |
[]byte |
次のページのトークンです。値が空でない場合は、次回の検索に渡します。 |
|
IsAllSuccess |
bool |
すべてのインデックスパーティションが検索されたかどうかを示します。false の場合、部分的な結果が返され、TotalCount が実際の一致行数より少なくなる可能性があります。 |
|
AggregationResults |
search.AggregationResults |
集約結果です。 |
|
GroupByResults |
search.GroupByResults |
グループ化結果です。 |
使用例
部分文字列検索のパフォーマンス向上
*word* のような検索パターンでは、多次元インデックス作成時に Text フィールドにファジーアナライザを設定し、そのフィールドに対してフレーズ一致検索を使用することを推奨します。この方法は、部分文字列の一致において通常、ワイルドカード検索よりも優れたパフォーマンスを発揮します。一致ルールおよび制限事項については、「トークンベースのワイルドカード検索」をご参照ください。
次の例では、file_name フィールドを含む多次元インデックスを作成し、そのフィールドにファジーアナライザを設定します。
analyzer := tablestore.Analyzer_Fuzzy
fieldSchema := &tablestore.FieldSchema{
FieldName: proto.String("file_name"),
FieldType: tablestore.FieldType_TEXT,
Index: proto.Bool(true),
Analyzer: &analyzer,
AnalyzerParameter: tablestore.FuzzyAnalyzerParameter{},
}
request := &tablestore.CreateSearchIndexRequest{
TableName: "example_table",
IndexName: "example_index",
IndexSchema: &tablestore.IndexSchema{
FieldSchemas: []*tablestore.FieldSchema{fieldSchema},
},
}
_, err := client.CreateSearchIndex(request)
if err != nil {
log.Fatal(err)
}
インデックスデータの同期後、MatchPhraseQuery を使用して、file_name フィールドに任意の位置で word を含む行を検索します。
query := &search.MatchPhraseQuery{
FieldName: "file_name",
Text: "word",
}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Rows)
ワイルドカードパターンに一致する行を除外
SQL の NOT LIKE に相当する処理を実現するには、WildcardQuery を BoolQuery.MustNotQueries に追加します。
wildcardQuery := &search.WildcardQuery{
FieldName: "category",
Value: "book-*",
}
query := &search.BoolQuery{
MustNotQueries: []search.Query{wildcardQuery},
}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Rows)