ブールクエリ
他のクエリのブールの組み合わせに一致するドキュメントを一致させるクエリです。boolクエリはLucene BooleanQuery
にマッピングされます。これは、1つ以上のブール句を使用して構築され、各句には型付きの出現があります。出現タイプは次のとおりです:
出現 | 説明 |
---|---|
must |
句(クエリ)は一致するドキュメントに必ず出現し、スコアに貢献します。 |
filter |
句(クエリ)は一致するドキュメントに必ず出現しなければなりません。ただし、must とは異なり、クエリのスコアは無視されます。フィルター句はフィルターコンテキストで実行されるため、スコアリングは無視され、句はキャッシュの対象とされます。 |
should |
句(クエリ)は一致するドキュメントに出現する必要があります。 |
must_not |
句(クエリ)は一致するドキュメントに出現してはなりません。句はフィルターコンテキストで実行されるため、スコアリングは無視され、句はキャッシュの対象とされます。スコアリングが無視されるため、すべてのドキュメントに0 のスコアが返されます。 |
#### Python
``````python
resp = client.search(
query={
"bool": {
"must": {
"term": {
"user.id": "kimchy"
}
},
"filter": {
"term": {
"tags": "production"
}
},
"must_not": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
},
"should": [
{
"term": {
"tags": "env1"
}
},
{
"term": {
"tags": "deployed"
}
}
],
"minimum_should_match": 1,
"boost": 1
}
},
)
print(resp)
`
Ruby
response = client.search(
body: {
query: {
bool: {
must: {
term: {
'user.id' => 'kimchy'
}
},
filter: {
term: {
tags: 'production'
}
},
must_not: {
range: {
age: {
gte: 10,
lte: 20
}
}
},
should: [
{
term: {
tags: 'env1'
}
},
{
term: {
tags: 'deployed'
}
}
],
minimum_should_match: 1,
boost: 1
}
}
}
)
puts response
Js
const response = await client.search({
query: {
bool: {
must: {
term: {
"user.id": "kimchy",
},
},
filter: {
term: {
tags: "production",
},
},
must_not: {
range: {
age: {
gte: 10,
lte: 20,
},
},
},
should: [
{
term: {
tags: "env1",
},
},
{
term: {
tags: "deployed",
},
},
],
minimum_should_match: 1,
boost: 1,
},
},
});
console.log(response);
Console
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
minimum_should_matchの使用
`````bool`````クエリに少なくとも1つの`````should`````句が含まれ、`````must`````または`````filter`````句が含まれていない場合、デフォルト値は`````1`````です。それ以外の場合、デフォルト値は`````0`````です。
他の有効な値については、[`````minimum_should_match`````パラメータ](/read/elasticsearch-8-15/a80bb044b9570e8b.md)を参照してください。
## bool.filterによるスコアリング
`````filter`````要素の下で指定されたクエリはスコアリングに影響を与えません—スコアは`````0`````として返されます。スコアは指定されたクエリによってのみ影響を受けます。たとえば、次の3つのクエリはすべて、`````status`````フィールドに`````active`````という用語が含まれるすべてのドキュメントを返します。
この最初のクエリは、スコアリングクエリが指定されていないため、すべてのドキュメントに`````0`````のスコアを割り当てます:
#### Php
``````php
$params = [
'body' => [
'query' => [
'bool' => [
'filter' => [
'term' => [
'status' => 'active',
],
],
],
],
],
];
$response = $client->search($params);
`
Python
resp = client.search(
query={
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
filter: {
term: {
status: 'active'
}
}
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
bool: {
filter: {
term: {
status: "active",
},
},
},
},
});
console.log(response);
Console
GET _search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
このbool
クエリにはmatch_all
クエリがあり、すべてのドキュメントに1.0
のスコアを割り当てます。
Php
$params = [
'body' => [
'query' => [
'bool' => [
'must' => [
'match_all' => [
],
],
'filter' => [
'term' => [
'status' => 'active',
],
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
term: {
status: 'active'
}
}
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
bool: {
must: {
match_all: {},
},
filter: {
term: {
status: "active",
},
},
},
},
});
console.log(response);
Console
GET _search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
このconstant_score
クエリは、上記の2番目の例とまったく同じように動作します。constant_score
クエリは、フィルターによって一致したすべてのドキュメントに1.0
のスコアを割り当てます。
Php
$params = [
'body' => [
'query' => [
'constant_score' => [
'filter' => [
'term' => [
'status' => 'active',
],
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
constant_score: {
filter: {
term: {
status: 'active'
}
}
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
constant_score: {
filter: {
term: {
status: "active",
},
},
},
},
});
console.log(response);
Console
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
名前付きクエリ
各クエリは、そのトップレベルの定義に_name
を受け入れます。名前付きクエリを使用して、どのクエリが返されたドキュメントに一致したかを追跡できます。名前付きクエリが使用される場合、レスポンスには各ヒットのmatched_queries
プロパティが含まれます。
同じリクエスト内で重複する_name
値を提供すると、未定義の動作が発生します。重複する名前のクエリは互いに上書きされる可能性があります。クエリ名は、単一のリクエスト内で一意であると見なされます。
Python
resp = client.search(
query={
"bool": {
"should": [
{
"match": {
"name.first": {
"query": "shay",
"_name": "first"
}
}
},
{
"match": {
"name.last": {
"query": "banon",
"_name": "last"
}
}
}
],
"filter": {
"terms": {
"name.last": [
"banon",
"kimchy"
],
"_name": "test"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
should: [
{
match: {
'name.first' => {
query: 'shay',
_name: 'first'
}
}
},
{
match: {
'name.last' => {
query: 'banon',
_name: 'last'
}
}
}
],
filter: {
terms: {
'name.last' => [
'banon',
'kimchy'
],
_name: 'test'
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
bool: {
should: [
{
match: {
"name.first": {
query: "shay",
_name: "first",
},
},
},
{
match: {
"name.last": {
query: "banon",
_name: "last",
},
},
},
],
filter: {
terms: {
"name.last": ["banon", "kimchy"],
_name: "test",
},
},
},
},
});
console.log(response);
Console
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "name.first": { "query": "shay", "_name": "first" } } },
{ "match": { "name.last": { "query": "banon", "_name": "last" } } }
],
"filter": {
"terms": {
"name.last": [ "banon", "kimchy" ],
"_name": "test"
}
}
}
}
}
スコアは、たとえばフィルターやmust_notコンテキストに出現する名前付きクエリ、または`````constant_score`````や`````function_score_query`````のようにスコアを無視または変更する句の内部にある場合、ドキュメントの最終スコアに寄与しない可能性があることに注意してください。
#### Python
``````python
resp = client.search(
include_named_queries_score=True,
query={
"bool": {
"should": [
{
"match": {
"name.first": {
"query": "shay",
"_name": "first"
}
}
},
{
"match": {
"name.last": {
"query": "banon",
"_name": "last"
}
}
}
],
"filter": {
"terms": {
"name.last": [
"banon",
"kimchy"
],
"_name": "test"
}
}
}
},
)
print(resp)
`
Ruby
response = client.search(
include_named_queries_score: true,
body: {
query: {
bool: {
should: [
{
match: {
'name.first' => {
query: 'shay',
_name: 'first'
}
}
},
{
match: {
'name.last' => {
query: 'banon',
_name: 'last'
}
}
}
],
filter: {
terms: {
'name.last' => [
'banon',
'kimchy'
],
_name: 'test'
}
}
}
}
}
)
puts response
Js
const response = await client.search({
include_named_queries_score: "true",
query: {
bool: {
should: [
{
match: {
"name.first": {
query: "shay",
_name: "first",
},
},
},
{
match: {
"name.last": {
query: "banon",
_name: "last",
},
},
},
],
filter: {
terms: {
"name.last": ["banon", "kimchy"],
_name: "test",
},
},
},
},
});
console.log(response);
Console
GET /_search?include_named_queries_score
{
"query": {
"bool": {
"should": [
{ "match": { "name.first": { "query": "shay", "_name": "first" } } },
{ "match": { "name.last": { "query": "banon", "_name": "last" } } }
],
"filter": {
"terms": {
"name.last": [ "banon", "kimchy" ],
"_name": "test"
}
}
}
}
}
この機能は、検索レスポンスの各ヒットで各名前付きクエリを再実行します。通常、これによりリクエストにわずかなオーバーヘッドが追加されます。ただし、大量のヒットに対して計算コストの高い名前付きクエリを使用すると、かなりのオーバーヘッドが追加される可能性があります。たとえば、多くのバケットに対するtop_hits
集約と組み合わせた名前付きクエリは、応答時間を長くする可能性があります。