距離特徴クエリ
relevance scoreを提供されたorigin
の日付またはポイントに近い文書に対してブーストします。たとえば、このクエリを使用して、特定の日付や場所に近い文書により多くの重みを与えることができます。
## 例リクエスト
### インデックス設定
`````distance_feature`````クエリを使用するには、インデックスに[`````date`````](/read/elasticsearch-8-15/9dfa1da42eb162ff.md)、[`````date_nanos`````](/read/elasticsearch-8-15/b43d322aa0194e4b.md)または[`````geo_point`````](/read/elasticsearch-8-15/88b015c027a75b7c.md)フィールドが含まれている必要があります。
`````distance_feature`````クエリのためにインデックスを設定する方法を確認するには、次の例を試してください。
- 1*.* 次のフィールドマッピングを持つ`````items`````インデックスを作成します:
- `````name`````、[`````keyword`````](/read/elasticsearch-8-15/491649a654160c3a.md)フィールド
- `````production_date`````、[`````date`````](/read/elasticsearch-8-15/9dfa1da42eb162ff.md)フィールド
- `````location`````、[`````geo_point`````](/read/elasticsearch-8-15/88b015c027a75b7c.md)フィールド
#### Python
``````python
resp = client.indices.create(
index="items",
mappings={
"properties": {
"name": {
"type": "keyword"
},
"production_date": {
"type": "date"
},
"location": {
"type": "geo_point"
}
}
},
)
print(resp)
`
Ruby
response = client.indices.create(
index: 'items',
body: {
mappings: {
properties: {
name: {
type: 'keyword'
},
production_date: {
type: 'date'
},
location: {
type: 'geo_point'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "items",
mappings: {
properties: {
name: {
type: "keyword",
},
production_date: {
type: "date",
},
location: {
type: "geo_point",
},
},
},
});
console.log(response);
コンソール
PUT /items
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"production_date": {
"type": "date"
},
"location": {
"type": "geo_point"
}
}
}
}
- 2. このインデックスにいくつかの文書をインデックスします。
Python
resp = client.index(
index="items",
id="1",
refresh=True,
document={
"name": "chocolate",
"production_date": "2018-02-01",
"location": [
-71.34,
41.12
]
},
)
print(resp)
resp1 = client.index(
index="items",
id="2",
refresh=True,
document={
"name": "chocolate",
"production_date": "2018-01-01",
"location": [
-71.3,
41.15
]
},
)
print(resp1)
resp2 = client.index(
index="items",
id="3",
refresh=True,
document={
"name": "chocolate",
"production_date": "2017-12-01",
"location": [
-71.3,
41.12
]
},
)
print(resp2)
Ruby
response = client.index(
index: 'items',
id: 1,
refresh: true,
body: {
name: 'chocolate',
production_date: '2018-02-01',
location: [
-71.34,
41.12
]
}
)
puts response
response = client.index(
index: 'items',
id: 2,
refresh: true,
body: {
name: 'chocolate',
production_date: '2018-01-01',
location: [
-71.3,
41.15
]
}
)
puts response
response = client.index(
index: 'items',
id: 3,
refresh: true,
body: {
name: 'chocolate',
production_date: '2017-12-01',
location: [
-71.3,
41.12
]
}
)
puts response
Js
const response = await client.index({
index: "items",
id: 1,
refresh: "true",
document: {
name: "chocolate",
production_date: "2018-02-01",
location: [-71.34, 41.12],
},
});
console.log(response);
const response1 = await client.index({
index: "items",
id: 2,
refresh: "true",
document: {
name: "chocolate",
production_date: "2018-01-01",
location: [-71.3, 41.15],
},
});
console.log(response1);
const response2 = await client.index({
index: "items",
id: 3,
refresh: "true",
document: {
name: "chocolate",
production_date: "2017-12-01",
location: [-71.3, 41.12],
},
});
console.log(response2);
コンソール
PUT /items/_doc/1?refresh
{
"name" : "chocolate",
"production_date": "2018-02-01",
"location": [-71.34, 41.12]
}
PUT /items/_doc/2?refresh
{
"name" : "chocolate",
"production_date": "2018-01-01",
"location": [-71.3, 41.15]
}
PUT /items/_doc/3?refresh
{
"name" : "chocolate",
"production_date": "2017-12-01",
"location": [-71.3, 41.12]
}
例クエリ
日付に基づいて文書をブースト
次のbool
検索は、name
値がchocolate
の文書を返します。この検索は、distance_feature
クエリを使用して、production_date
値がnow
に近い文書の関連スコアを増加させます。
Python
resp = client.search(
index="items",
query={
"bool": {
"must": {
"match": {
"name": "chocolate"
}
},
"should": {
"distance_feature": {
"field": "production_date",
"pivot": "7d",
"origin": "now"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'items',
body: {
query: {
bool: {
must: {
match: {
name: 'chocolate'
}
},
should: {
distance_feature: {
field: 'production_date',
pivot: '7d',
origin: 'now'
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "items",
query: {
bool: {
must: {
match: {
name: "chocolate",
},
},
should: {
distance_feature: {
field: "production_date",
pivot: "7d",
origin: "now",
},
},
},
},
});
console.log(response);
コンソール
GET /items/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "chocolate"
}
},
"should": {
"distance_feature": {
"field": "production_date",
"pivot": "7d",
"origin": "now"
}
}
}
}
}
位置に基づいて文書をブースト
次のbool
検索は、name
値がchocolate
の文書を返します。この検索は、distance_feature
クエリを使用して、location
値が[-71.3, 41.15]
に近い文書の関連スコアを増加させます。
Python
resp = client.search(
index="items",
query={
"bool": {
"must": {
"match": {
"name": "chocolate"
}
},
"should": {
"distance_feature": {
"field": "location",
"pivot": "1000m",
"origin": [
-71.3,
41.15
]
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'items',
body: {
query: {
bool: {
must: {
match: {
name: 'chocolate'
}
},
should: {
distance_feature: {
field: 'location',
pivot: '1000m',
origin: [
-71.3,
41.15
]
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "items",
query: {
bool: {
must: {
match: {
name: "chocolate",
},
},
should: {
distance_feature: {
field: "location",
pivot: "1000m",
origin: [-71.3, 41.15],
},
},
},
},
});
console.log(response);
コンソール
GET /items/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "chocolate"
}
},
"should": {
"distance_feature": {
"field": "location",
"pivot": "1000m",
"origin": [-71.3, 41.15]
}
}
}
}
}
距離特徴のためのトップレベルパラメータ
field
- (必須、文字列) 距離を計算するために使用されるフィールドの名前。このフィールドは次の基準を満たす必要があります:
date
、date_nanos
またはgeo_point
フィールドであることindex
マッピングパラメータ値がtrue
であること、これはデフォルトですdoc_values
マッピングパラメータ値がtrue
であること、これはデフォルトです
origin
- (必須、文字列) 距離を計算するために使用される日付または起点。
field
値がdate
またはdate_nanos
フィールドの場合、origin
値は日付でなければなりません。日付数学、now-1h
のようなものがサポートされています。field
値がgeo_point
フィールドの場合、origin
値はジオポイントでなければなりません。 pivot
- (必須、時間単位または距離単位) 関連スコアが
boost
値の半分を受け取るorigin
からの距離。field
値がdate
またはdate_nanos
フィールドの場合、pivot
値は時間単位でなければなりません、1h
や10d
のような。field
値がgeo_point
フィールドの場合、pivot
値は距離単位でなければなりません、1km
や12m
のような。 boost
- (オプション、浮動小数点) 一致する文書の関連スコアを乗算するために使用される浮動小数点数。この値は負であってはなりません。デフォルトは
1.0
です。
ノート
距離特徴クエリが関連スコアを計算する方法
`````distance_feature`````クエリは、文書の[関連スコア](e8aa4b0e7ff9e612.md#relevance-scores)を次のように計算します:
``````bash
relevance score = boost * pivot / (pivot + distance)
`
distance
は、origin
値と文書のフィールド値との絶対差です。
非競争ヒットをスキップ
function_score
クエリや他の方法で関連スコアを変更するのとは異なり、distance_feature
クエリは、track_total_hits
パラメータがnot true
の場合、非競争ヒットを効率的にスキップします。