入力中検索フィールドタイプ
search_as_you_type
フィールドタイプは、入力中の補完ユースケースに対応するクエリを即座にサポートするように最適化されたテキストのようなフィールドです。これは、インデックスされたテキスト値全体に部分的に一致するクエリによって効率的に一致できる用語をインデックスするために分析される一連のサブフィールドを作成します。プレフィックス補完(つまり、入力の先頭から始まる用語の一致)とインフィックス補完(つまり、入力内の任意の位置での用語の一致)の両方がサポートされています。
このタイプのフィールドをマッピングに追加する際
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
my_field: {
type: 'search_as_you_type'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
my_field: {
type: "search_as_you_type",
},
},
},
});
console.log(response);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
}
}
次のフィールドが作成されます
my_field |
マッピングで設定されたように分析されます。アナライザーが設定されていない場合、 デフォルトのインデックスアナライザーが使用されます |
my_field._2gram |
my_field のアナライザーをシングルトークンフィルターのシングルサイズ2でラップします |
my_field._3gram |
my_field のアナライザーをシングルトークンフィルターのシングルサイズ3でラップします |
my_field._index_prefix |
my_field._3gram のアナライザーをエッジngramトークンフィルターでラップします |
サブフィールドのシングルサイズは、max_shingle_size
マッピングパラメータで設定できます。デフォルトは3で、このパラメータの有効な値は整数値2 - 4(含む)です。シングルサブフィールドは、2からmax_shingle_size
を含む各シングルサイズのために作成されます。my_field._index_prefix
サブフィールドは、max_shingle_size
を持つシングルサブフィールドのアナライザーを使用して常に自身のアナライザーを構築します。
max_shingle_size
を増加させることで、より多くの連続した用語を持つクエリの一致が改善されますが、インデックスサイズが大きくなります。デフォルトの max_shingle_size
は通常十分です。
同じ入力テキストは、インデックスされたドキュメントがルートフィールド my_field
の値を持つときに、自動的にこれらのフィールドにインデックスされ、異なる分析チェーンを持ちます。
Python
resp = client.index(
index="my-index-000001",
id="1",
refresh=True,
document={
"my_field": "quick brown fox jump lazy dog"
},
)
print(resp)
Ruby
response = client.index(
index: 'my-index-000001',
id: 1,
refresh: true,
body: {
my_field: 'quick brown fox jump lazy dog'
}
)
puts response
Js
const response = await client.index({
index: "my-index-000001",
id: 1,
refresh: "true",
document: {
my_field: "quick brown fox jump lazy dog",
},
});
console.log(response);
コンソール
PUT my-index-000001/_doc/1?refresh
{
"my_field": "quick brown fox jump lazy dog"
}
入力中検索ユースケースに対応するための最も効率的なクエリ方法は、通常、ルート search_as_you_type
フィールドとそのシングルサブフィールドをターゲットにした multi_match
タイプの bool_prefix
クエリです。これは、クエリ用語を任意の順序で一致させることができますが、シングルサブフィールド内で用語が順序通りに含まれている場合、ドキュメントのスコアが高くなります。
Python
resp = client.search(
index="my-index-000001",
query={
"multi_match": {
"query": "brown f",
"type": "bool_prefix",
"fields": [
"my_field",
"my_field._2gram",
"my_field._3gram"
]
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my-index-000001',
body: {
query: {
multi_match: {
query: 'brown f',
type: 'bool_prefix',
fields: [
'my_field',
'my_field._2gram',
'my_field._3gram'
]
}
}
}
)
puts response
Js
const response = await client.search({
index: "my-index-000001",
query: {
multi_match: {
query: "brown f",
type: "bool_prefix",
fields: ["my_field", "my_field._2gram", "my_field._3gram"],
},
},
});
console.log(response);
コンソール
GET my-index-000001/_search
{
"query": {
"multi_match": {
"query": "brown f",
"type": "bool_prefix",
"fields": [
"my_field",
"my_field._2gram",
"my_field._3gram"
]
}
}
}
コンソール-結果
{
"took" : 44,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.8630463,
"hits" : [
{
"_index" : "my-index-000001",
"_id" : "1",
"_score" : 0.8630463,
"_source" : {
"my_field" : "quick brown fox jump lazy dog"
}
}
]
}
}
クエリ用語を厳密に順序通りに一致させるドキュメントを検索するには、またはフレーズクエリの他のプロパティを使用するには、ルートフィールドに対して match_phrase_prefix
クエリ](/read/elasticsearch-8-15/75ea6f189133f3ff.md) を使用します。最後の用語を正確に一致させる必要がある場合は、match_phrase
クエリ も使用できます。フレーズクエリを使用することは、match_bool_prefix
クエリを使用するよりも効率が悪い場合があります。
Python
resp = client.search(
index="my-index-000001",
query={
"match_phrase_prefix": {
"my_field": "brown f"
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my-index-000001',
body: {
query: {
match_phrase_prefix: {
my_field: 'brown f'
}
}
}
)
puts response
Js
const response = await client.search({
index: "my-index-000001",
query: {
match_phrase_prefix: {
my_field: "brown f",
},
},
});
console.log(response);
コンソール
GET my-index-000001/_search
{
"query": {
"match_phrase_prefix": {
"my_field": "brown f"
}
}
}
search_as_you_type フィールドに特有のパラメータ
次のパラメータは、search_as_you_type
フィールドのマッピングで受け入れられ、このフィールドタイプに特有です
max_shingle_size
- (オプション、整数)作成する最大シングルサイズ。有効な値は
2
(含む)から4
(含む)です。デフォルトは3
です。2
とこの値の間の各整数のためにサブフィールドが作成されます。たとえば、3
の値は、my_field._2gram
とmy_field._3gram
の2つのサブフィールドを作成します。
より多くのサブフィールドは、より特定のクエリを可能にしますが、インデックスサイズが増加します。
テキストフィールドとしてのフィールドタイプのパラメータ
次のパラメータは、search_as_you_type
フィールドのマッピングで受け入れられ、その性質上、text
データタイプのフィールドを構成する際の動作に似ています。特に記載がない限り、これらのオプションはルートフィールドのサブフィールドを同じ方法で構成します。
analyzer
text
フィールドに使用されるべき analyzer、インデックス時と検索時の両方(search_analyzer
によってオーバーライドされない限り)。デフォルトはデフォルトのインデックスアナライザー、またはstandard
アナライザー です。index
- フィールドは検索可能であるべきですか?
true
(デフォルト)またはfalse
を受け入れます。 index_options
- 検索およびハイライト目的でインデックスに保存されるべき情報。デフォルトは
positions
です。 norms
- クエリのスコアリング時にフィールドの長さを考慮するべきかどうか。
true
またはfalse
を受け入れます。このオプションはルートフィールドとシングルサブフィールドを構成し、そのデフォルトはtrue
です。プレフィックスサブフィールドはfalse
です。 store
- フィールド値は、
_source
フィールドから別々に保存および取得可能であるべきですか。true
またはfalse
(デフォルト)を受け入れます。このオプションはルートフィールドのみを構成し、サブフィールドは構成しません。 search_analyzer
analyzer
が検索時にtext
フィールドで使用されるべきです。デフォルトはanalyzer
設定です。search_quote_analyzer
- フレーズが出現したときに検索時に使用されるべき
analyzer
。デフォルトはsearch_analyzer
設定です。 similarity
- どのスコアリングアルゴリズムまたは類似性が使用されるべきか。デフォルトは
BM25
です。 term_vector
- フィールドのために用語ベクターが保存されるべきか。デフォルトは
no
です。このオプションはルートフィールドとシングルサブフィールドを構成しますが、プレフィックスサブフィールドは構成しません。
プレフィックスクエリの最適化
ルートフィールドまたはそのサブフィールドのいずれかに対して prefix
クエリを行うと、クエリは ._index_prefix
サブフィールドに対する term
クエリに書き換えられます。これは、prefix
テキストフィールドに対するクエリの典型的なものよりも効率的に一致します。各シングルの特定の長さまでのプレフィックスが ._index_prefix
サブフィールドの用語として直接インデックスされるためです。
._index_prefix
サブフィールドのアナライザーは、通常はシングルとして生成されないフィールドの値の末尾にある用語のプレフィックスもインデックスするようにシングルビルディングの動作をわずかに修正します。たとえば、quick brown fox
の値が search_as_you_type
フィールドに max_shingle_size
が3の状態でインデックスされると、brown fox
と fox
のプレフィックスも ._index_prefix
サブフィールドにインデックスされます。._3gram
サブフィールドに用語として表示されないにもかかわらず、これによりフィールドの入力内のすべての用語の補完が可能になります。
合成 _source
合成 _source
は、一般的に TSDB インデックス(index.mode
が time_series
に設定されているインデックス)に対してのみ利用可能です。他のインデックスに対しては、合成 _source
は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために作業しますが、技術プレビューの機能は公式 GA 機能のサポート SLA の対象ではありません。
search_as_you_type
フィールドは、デフォルト構成で 合成 _source
をサポートします。合成 _source
は、copy_to
と一緒に使用することはできません。