Multi-match query
multi_match
クエリは、match
クエリ を基にして、複数フィールドのクエリを可能にします:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'this is a test',
'fields' => [
'subject',
'message',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "this is a test",
"fields": [
"subject",
"message"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'this is a test',
fields: [
'subject',
'message'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "this is a test",
"fields": [
"subject",
"message"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "this is a test",
fields: ["subject", "message"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "subject", "message" ]
}
}
}
クエリ文字列。 | |
クエリ対象のフィールド。 |
fields and per-field boosting
フィールドはワイルドカードで指定できます。例えば:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'Will Smith',
'fields' => [
'title',
'*_name',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "Will Smith",
"fields": [
"title",
"*_name"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'Will Smith',
fields: [
'title',
'*_name'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "Will Smith",
"fields": [
"title",
"*_name"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "Will Smith",
fields: ["title", "*_name"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
title 、first_name 、last_name フィールドをクエリします。 |
個々のフィールドはキャレット (^
) 表記でブーストできます:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'this is a test',
'fields' => [
'subject^3',
'message',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "this is a test",
"fields": [
"subject^3",
"message"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'this is a test',
fields: [
'subject^3',
'message'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "this is a test",
"fields": [
"subject^3",
"message"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "this is a test",
fields: ["subject^3", "message"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ]
}
}
}
subject フィールドのスコアを3倍にしますが、message フィールドのスコアは変更しません。 |
fields
が提供されていない場合、multi_match
クエリは index.query.default_field
インデックス設定にデフォルトし、さらに *
にデフォルトします。 *
は、用語クエリに適格なマッピング内のすべてのフィールドを抽出し、メタデータフィールドをフィルタリングします。抽出されたすべてのフィールドは、クエリを構築するために組み合わされます。
Field number limit
デフォルトでは、クエリに含まれる句の数に制限があります。この制限は、indices.query.bool.max_clause_count
設定によって定義され、デフォルトは 4096
です。マルチマッチクエリの場合、句の数はフィールドの数と用語の数を掛けたものとして計算されます。
Types of multi_match query:
multi_match
クエリの内部実行方法は、type
パラメータに依存し、次のように設定できます:
best_fields |
(デフォルト) 任意のフィールドに一致するドキュメントを見つけますが、_score は最良のフィールドから使用されます。 best_fields を参照してください。 |
most_fields |
任意のフィールドに一致するドキュメントを見つけ、各フィールドから _score を組み合わせます。 most_fields を参照してください。 |
cross_fields |
同じ analyzer を持つフィールドを1つの大きなフィールドのように扱います。任意のフィールドで各単語を探します。 cross_fields を参照してください。 |
phrase |
各フィールドで match_phrase クエリを実行し、最良のフィールドから _score を使用します。 phrase と phrase_prefix を参照してください。 |
phrase_prefix |
各フィールドで match_phrase_prefix クエリを実行し、最良のフィールドから _score を使用します。 phrase と phrase_prefix を参照してください。 |
| bool_prefix
| 各フィールドで match_bool_prefix
クエリを作成し、各フィールドから _score
を組み合わせます。 bool_prefix
を参照してください。
best_fields
best_fields
タイプは、同じフィールドで最もよく見つかる複数の単語を検索する際に最も便利です。例えば、「茶色の狐」は、1つのフィールドに「茶色」と別のフィールドに「狐」があるよりも意味があります。
best_fields
タイプは、各フィールドに対して match
クエリ を生成し、それらを dis_max
クエリでラップして、最も一致するフィールドを見つけます。例えば、このクエリ:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'brown fox',
'type' => 'best_fields',
'fields' => [
'subject',
'message',
],
'tie_breaker' => 0.3,
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "brown fox",
"type": "best_fields",
"fields": [
"subject",
"message"
],
"tie_breaker": 0.3
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'brown fox',
type: 'best_fields',
fields: [
'subject',
'message'
],
tie_breaker: 0.3
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "brown fox",
"type": "best_fields",
"fields": [
"subject",
"message"
],
"tie_breaker": 0.3
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "brown fox",
type: "best_fields",
fields: ["subject", "message"],
tie_breaker: 0.3,
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "brown fox",
"type": "best_fields",
"fields": [ "subject", "message" ],
"tie_breaker": 0.3
}
}
}
実行されるのは:
Php
$params = [
'body' => [
'query' => [
'dis_max' => [
'queries' => [
[
'match' => [
'subject' => 'brown fox',
],
],
[
'match' => [
'message' => 'brown fox',
],
],
],
'tie_breaker' => 0.3,
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"dis_max": {
"queries": [
{
"match": {
"subject": "brown fox"
}
},
{
"match": {
"message": "brown fox"
}
}
],
"tie_breaker": 0.3
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
dis_max: {
queries: [
{
match: {
subject: 'brown fox'
}
},
{
match: {
message: 'brown fox'
}
}
],
tie_breaker: 0.3
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"dis_max": {
"queries": [
{
"match": {
"subject": "brown fox"
}
},
{
"match": {
"message": "brown fox"
}
}
],
"tie_breaker": 0.3
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
dis_max: {
queries: [
{
match: {
subject: "brown fox",
},
},
{
match: {
message: "brown fox",
},
},
],
tie_breaker: 0.3,
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "subject": "brown fox" }},
{ "match": { "message": "brown fox" }}
],
"tie_breaker": 0.3
}
}
}
通常、best_fields
タイプは 単一 の最良の一致フィールドのスコアを使用しますが、tie_breaker
が指定されている場合、スコアは次のように計算されます:
- 最良の一致フィールドからのスコア
- 他のすべての一致フィールドに対して
tie_breaker * _score
また、analyzer
、boost
、operator
、minimum_should_match
、fuzziness
、lenient
、prefix_length
、max_expansions
、fuzzy_rewrite
、zero_terms_query
、auto_generate_synonyms_phrase_query
、fuzzy_transpositions
が受け入れられます。これは、match query で説明されています。
operator and minimum_should_match
best_fields
と most_fields
タイプは フィールド中心 です。つまり、各フィールドごとに match
クエリを生成します。これは、operator
と minimum_should_match
パラメータが各フィールドに個別に適用されることを意味し、これはおそらく望ましくない結果です。
このクエリを例に取ります:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'Will Smith',
'type' => 'best_fields',
'fields' => [
'first_name',
'last_name',
],
'operator' => 'and',
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "Will Smith",
"type": "best_fields",
"fields": [
"first_name",
"last_name"
],
"operator": "and"
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'Will Smith',
type: 'best_fields',
fields: [
'first_name',
'last_name'
],
operator: 'and'
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "Will Smith",
"type": "best_fields",
"fields": [
"first_name",
"last_name"
],
"operator": "and"
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "Will Smith",
type: "best_fields",
fields: ["first_name", "last_name"],
operator: "and",
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"type": "best_fields",
"fields": [ "first_name", "last_name" ],
"operator": "and"
}
}
}
すべての用語が存在する必要があります。 |
このクエリは次のように実行されます:
(+first_name:will +first_name:smith)
| (+last_name:will +last_name:smith)
言い換えれば、すべての用語 は 単一のフィールド に存在する必要があります。
combined_fields
クエリは、operator
と minimum_should_match
を用語ごとに処理する用語中心のアプローチを提供します。他のマルチマッチモード cross_fields
もこの問題に対処します。
most_fields
most_fields
タイプは、異なる方法で分析された同じテキストを含む複数のフィールドをクエリする際に最も便利です。例えば、メインフィールドには同義語、ステミング、ダイアクリティックなしの用語が含まれる場合があります。2番目のフィールドには元の用語が含まれ、3番目のフィールドにはシングルが含まれるかもしれません。すべてのフィールドからスコアを組み合わせることで、メインフィールドでできるだけ多くのドキュメントに一致させることができますが、2番目と3番目のフィールドを使用して、最も類似した結果をリストの上位に押し上げます。
このクエリ:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'quick brown fox',
'type' => 'most_fields',
'fields' => [
'title',
'title.original',
'title.shingles',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "quick brown fox",
"type": "most_fields",
"fields": [
"title",
"title.original",
"title.shingles"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'quick brown fox',
type: 'most_fields',
fields: [
'title',
'title.original',
'title.shingles'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "quick brown fox",
"type": "most_fields",
"fields": [
"title",
"title.original",
"title.shingles"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "quick brown fox",
type: "most_fields",
fields: ["title", "title.original", "title.shingles"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown fox",
"type": "most_fields",
"fields": [ "title", "title.original", "title.shingles" ]
}
}
}
実行されるのは:
Php
$params = [
'body' => [
'query' => [
'bool' => [
'should' => [
[
'match' => [
'title' => 'quick brown fox',
],
],
[
'match' => [
'title.original' => 'quick brown fox',
],
],
[
'match' => [
'title.shingles' => 'quick brown fox',
],
],
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"bool": {
"should": [
{
"match": {
"title": "quick brown fox"
}
},
{
"match": {
"title.original": "quick brown fox"
}
},
{
"match": {
"title.shingles": "quick brown fox"
}
}
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
should: [
{
match: {
title: 'quick brown fox'
}
},
{
match: {
'title.original' => 'quick brown fox'
}
},
{
match: {
'title.shingles' => 'quick brown fox'
}
}
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"bool": {
"should": [
{
"match": {
"title": "quick brown fox"
}
},
{
"match": {
"title.original": "quick brown fox"
}
},
{
"match": {
"title.shingles": "quick brown fox"
}
}
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
bool: {
should: [
{
match: {
title: "quick brown fox",
},
},
{
match: {
"title.original": "quick brown fox",
},
},
{
match: {
"title.shingles": "quick brown fox",
},
},
],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "quick brown fox" }},
{ "match": { "title.original": "quick brown fox" }},
{ "match": { "title.shingles": "quick brown fox" }}
]
}
}
}
各 match
句からのスコアは、bool
クエリのように合計されます。
また、analyzer
、boost
、operator
、minimum_should_match
、fuzziness
、lenient
、prefix_length
、max_expansions
、fuzzy_rewrite
が受け入れられます。
phrase and phrase_prefix
phrase
と phrase_prefix
タイプは、best_fields
と同様に動作しますが、match_phrase
または match_phrase_prefix
クエリを使用します。match
クエリの代わりに。
このクエリ:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'quick brown f',
'type' => 'phrase_prefix',
'fields' => [
'subject',
'message',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "quick brown f",
"type": "phrase_prefix",
"fields": [
"subject",
"message"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'quick brown f',
type: 'phrase_prefix',
fields: [
'subject',
'message'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "quick brown f",
"type": "phrase_prefix",
"fields": [
"subject",
"message"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "quick brown f",
type: "phrase_prefix",
fields: ["subject", "message"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown f",
"type": "phrase_prefix",
"fields": [ "subject", "message" ]
}
}
}
実行されるのは:
Php
$params = [
'body' => [
'query' => [
'dis_max' => [
'queries' => [
[
'match_phrase_prefix' => [
'subject' => 'quick brown f',
],
],
[
'match_phrase_prefix' => [
'message' => 'quick brown f',
],
],
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"dis_max": {
"queries": [
{
"match_phrase_prefix": {
"subject": "quick brown f"
}
},
{
"match_phrase_prefix": {
"message": "quick brown f"
}
}
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
dis_max: {
queries: [
{
match_phrase_prefix: {
subject: 'quick brown f'
}
},
{
match_phrase_prefix: {
message: 'quick brown f'
}
}
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"dis_max": {
"queries": [
{
"match_phrase_prefix": {
"subject": "quick brown f"
}
},
{
"match_phrase_prefix": {
"message": "quick brown f"
}
}
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
dis_max: {
queries: [
{
match_phrase_prefix: {
subject: "quick brown f",
},
},
{
match_phrase_prefix: {
message: "quick brown f",
},
},
],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match_phrase_prefix": { "subject": "quick brown f" }},
{ "match_phrase_prefix": { "message": "quick brown f" }}
]
}
}
}
また、analyzer
、[boost
] 、[lenient
] 、[zero_terms_query
] が Match で説明されているようにサポートされており、[slop
] は Match phrase で説明されています。 phrase_prefix
タイプは、max_expansions
も受け入れます。
phrase, phrase_prefix and fuzziness
fuzziness
パラメータは、phrase
または phrase_prefix
タイプと一緒に使用できません。
cross_fields
cross_fields
タイプは、複数のフィールドが 一致するべき 構造化ドキュメントで特に便利です。例えば、first_name
と last_name
フィールドを「ウィル・スミス」でクエリすると、最良の一致は1つのフィールドに「ウィル」があり、別のフィールドに「スミス」がある可能性が高いです。
これは most_fields
の仕事のように思えますが、そのアプローチには2つの問題があります。最初の問題は、operator
と minimum_should_match
がフィールドごとに適用され、用語ごとではないことです(上記の説明 を参照)。
2つ目の問題は関連性に関するもので、first_name
と last_name
フィールドの異なる用語頻度が予期しない結果を生む可能性があります。
例えば、2人の人がいると想像してみてください。「ウィル・スミス」と「スミス・ジョーンズ」。姓としての「スミス」は非常に一般的で(したがって重要度が低い)、名としての「スミス」は非常に珍しい(したがって重要度が高い)です。
「ウィル・スミス」を検索すると、「スミス・ジョーンズ」ドキュメントが、first_name:smith
のスコアが first_name:will
と last_name:smith
の合計スコアを上回るため、より良い一致の「ウィル・スミス」よりも上に表示される可能性があります。
これらのタイプのクエリに対処する1つの方法は、first_name
と last_name
フィールドを単一の full_name
フィールドにインデックスすることです。もちろん、これはインデックス時にのみ行うことができます。
cross_field
タイプは、クエリ時にこれらの問題を解決しようとし、用語中心 のアプローチを取ります。最初にクエリ文字列を個々の用語に分析し、次に各用語を任意のフィールドで探します。まるでそれらが1つの大きなフィールドであるかのように。
次のようなクエリ:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'Will Smith',
'type' => 'cross_fields',
'fields' => [
'first_name',
'last_name',
],
'operator' => 'and',
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "Will Smith",
"type": "cross_fields",
"fields": [
"first_name",
"last_name"
],
"operator": "and"
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'Will Smith',
type: 'cross_fields',
fields: [
'first_name',
'last_name'
],
operator: 'and'
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "Will Smith",
"type": "cross_fields",
"fields": [
"first_name",
"last_name"
],
"operator": "and"
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "Will Smith",
type: "cross_fields",
fields: ["first_name", "last_name"],
operator: "and",
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "first_name", "last_name" ],
"operator": "and"
}
}
}
次のように実行されます:
+(first_name:will last_name:will)
+(first_name:smith last_name:smith)
言い換えれば、すべての用語 は 少なくとも1つのフィールド に存在する必要があります。(best_fields
と most_fields
で使用される論理と比較してください。)
これにより、2つの問題のうちの1つが解決されます。異なる用語頻度の問題は、すべてのフィールドの用語頻度をブレンドすることで解決され、違いを均一化します。
実際には、first_name:smith
は last_name:smith
と同じ頻度を持つかのように扱われ、さらに1が加算されます。これにより、first_name
と last_name
の一致が比較可能なスコアを持ち、last_name
にわずかな利点が与えられます。last_name
は smith
を含む可能性が最も高いフィールドだからです。
cross_fields
は通常、すべての boost
が 1
である短い文字列フィールドでのみ有用です。それ以外の場合、ブースト、用語頻度、長さの正規化がスコアに寄与し、用語統計のブレンドがもはや意味を持たなくなります。
上記のクエリを Validate を通して実行すると、次の説明が返されます:
+blended("will", fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])
また、analyzer
、boost
、operator
、minimum_should_match
、lenient
、zero_terms_query
が受け入れられます。
cross_fields
タイプは、フィールド統計を複雑な方法でブレンドし、解釈が難しい場合があります。スコアの組み合わせが不正確になることもあり、特に一部のドキュメントが検索フィールドの一部を含むが、すべてを含まない場合に発生します。combined_fields
クエリを代替手段として考慮すべきで、これは用語中心ですが、フィールド統計をより堅牢な方法で組み合わせます。
cross_field and analysis
cross_field
タイプは、同じアナライザーを持つフィールドでのみ用語中心モードで機能します。同じアナライザーを持つフィールドは、上記の例のようにグループ化されます。複数のグループがある場合、クエリは任意のグループから最良のスコアを使用します。
例えば、first
と last
フィールドが同じアナライザーを持ち、first.edge
と last.edge
が edge_ngram
アナライザーを使用している場合、このクエリ:
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'Jon',
'type' => 'cross_fields',
'fields' => [
'first',
'first.edge',
'last',
'last.edge',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "Jon",
"type": "cross_fields",
"fields": [
"first",
"first.edge",
"last",
"last.edge"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'Jon',
type: 'cross_fields',
fields: [
'first',
'first.edge',
'last',
'last.edge'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "Jon",
"type": "cross_fields",
"fields": [
"first",
"first.edge",
"last",
"last.edge"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "Jon",
type: "cross_fields",
fields: ["first", "first.edge", "last", "last.edge"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "Jon",
"type": "cross_fields",
"fields": [
"first", "first.edge",
"last", "last.edge"
]
}
}
}
次のように実行されます:
blended("jon", fields: [first, last])
| (
blended("j", fields: [first.edge, last.edge])
blended("jo", fields: [first.edge, last.edge])
blended("jon", fields: [first.edge, last.edge])
)
言い換えれば、first
と last
はグループ化され、単一のフィールドとして扱われ、first.edge
と last.edge
はグループ化され、単一のフィールドとして扱われます。
複数のグループを持つことは問題ありませんが、operator
または minimum_should_match
と組み合わせると、most_fields
または best_fields
と同じ問題に悩まされる可能性があります。
このクエリを2つの別々の cross_fields
クエリとして再構成し、dis_max
クエリで組み合わせ、minimum_should_match
パラメータをそのうちの1つにのみ適用することができます:
Python
resp = client.search(
query={
"dis_max": {
"queries": [
{
"multi_match": {
"query": "Will Smith",
"type": "cross_fields",
"fields": [
"first",
"last"
],
"minimum_should_match": "50%"
}
},
{
"multi_match": {
"query": "Will Smith",
"type": "cross_fields",
"fields": [
"*.edge"
]
}
}
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
dis_max: {
queries: [
{
multi_match: {
query: 'Will Smith',
type: 'cross_fields',
fields: [
'first',
'last'
],
minimum_should_match: '50%'
}
},
{
multi_match: {
query: 'Will Smith',
type: 'cross_fields',
fields: [
'*.edge'
]
}
}
]
}
}
}
)
puts response
Js
const response = await client.search({
query: {
dis_max: {
queries: [
{
multi_match: {
query: "Will Smith",
type: "cross_fields",
fields: ["first", "last"],
minimum_should_match: "50%",
},
},
{
multi_match: {
query: "Will Smith",
type: "cross_fields",
fields: ["*.edge"],
},
},
],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"dis_max": {
"queries": [
{
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "first", "last" ],
"minimum_should_match": "50%"
}
},
{
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "*.edge" ]
}
}
]
}
}
}
will または smith は、first または last フィールドのいずれかに存在する必要があります。 |
クエリ内で analyzer
パラメータを指定することで、すべてのフィールドを同じグループに強制することができます。
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'Jon',
'type' => 'cross_fields',
'analyzer' => 'standard',
'fields' => [
'first',
'last',
'*.edge',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "Jon",
"type": "cross_fields",
"analyzer": "standard",
"fields": [
"first",
"last",
"*.edge"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'Jon',
type: 'cross_fields',
analyzer: 'standard',
fields: [
'first',
'last',
'*.edge'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "Jon",
"type": "cross_fields",
"analyzer": "standard",
"fields": [
"first",
"last",
"*.edge"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "Jon",
type: "cross_fields",
analyzer: "standard",
fields: ["first", "last", "*.edge"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "Jon",
"type": "cross_fields",
"analyzer": "standard",
"fields": [ "first", "last", "*.edge" ]
}
}
}
すべてのフィールドに standard アナライザーを使用します。 |
次のように実行されます:
blended("will", fields: [first, first.edge, last.edge, last])
blended("smith", fields: [first, first.edge, last.edge, last])
tie_breaker
デフォルトでは、各用語ごとの blended
クエリは、グループ内の任意のフィールドから返された最良のスコアを使用します。次に、グループ間でスコアを組み合わせると、クエリは任意のグループからの最良のスコアを使用します。tie_breaker
パラメータは、これらのステップの両方の動作を変更できます:
0.0 |
(例)first_name:will と last_name:will の中から単一の最良スコアを取得します(デフォルト) |
1.0 |
(例)first_name:will と last_name:will のスコアを合計します |
0.0 < n < 1.0 |
単一の最良スコアに tie_breaker を掛けたものを、他の一致フィールド/グループからの各スコアに加えます |
cross_fields and fuzziness
fuzziness
パラメータは、cross_fields
タイプと一緒に使用できません。
bool_prefix
bool_prefix
タイプのスコアリングは、most_fields
のように動作しますが、match
クエリの代わりに match_bool_prefix
クエリ を使用します。
Php
$params = [
'body' => [
'query' => [
'multi_match' => [
'query' => 'quick brown f',
'type' => 'bool_prefix',
'fields' => [
'subject',
'message',
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"multi_match": {
"query": "quick brown f",
"type": "bool_prefix",
"fields": [
"subject",
"message"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
multi_match: {
query: 'quick brown f',
type: 'bool_prefix',
fields: [
'subject',
'message'
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"multi_match": {
"query": "quick brown f",
"type": "bool_prefix",
"fields": [
"subject",
"message"
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
multi_match: {
query: "quick brown f",
type: "bool_prefix",
fields: ["subject", "message"],
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown f",
"type": "bool_prefix",
"fields": [ "subject", "message" ]
}
}
}
analyzer
、[boost
] 、[operator
] 、[minimum_should_match
] 、[lenient
] 、[zero_terms_query
] 、[auto_generate_synonyms_phrase_query
] パラメータは、match query で説明されているようにサポートされています。[fuzziness
] 、[prefix_length
] 、[max_expansions
] 、[fuzzy_rewrite
] 、[fuzzy_transpositions
] パラメータは、用語クエリを構築するために使用される用語に対してサポートされていますが、最終的な用語から構築されたプレフィックスクエリには影響しません。
slop
パラメータは、このクエリタイプではサポートされていません。