Term vectors API
特定のドキュメントのフィールド内の用語に関する情報と統計を取得します。
Python
resp = client.termvectors(
index="my-index-000001",
id="1",
)
print(resp)
Ruby
response = client.termvectors(
index: 'my-index-000001',
id: 1
)
puts response
Js
const response = await client.termvectors({
index: "my-index-000001",
id: 1,
});
console.log(response);
Console
GET /my-index-000001/_termvectors/1
Request
GET /<index>/_termvectors/<_id>
Prerequisites
- Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットインデックスまたはインデックスエイリアスに対して
read
インデックス権限を持っている必要があります。
Description
インデックスに保存されているドキュメントや、リクエストのボディに渡された人工ドキュメントの用語ベクトルを取得できます。
#### Python
``````python
resp = client.termvectors(
index="my-index-000001",
id="1",
fields="message",
)
print(resp)
`
Ruby
response = client.termvectors(
index: 'my-index-000001',
id: 1,
fields: 'message'
)
puts response
Js
const response = await client.termvectors({
index: "my-index-000001",
id: 1,
fields: "message",
});
console.log(response);
Console
GET /my-index-000001/_termvectors/1?fields=message
フィールドは、マルチマッチクエリのようにワイルドカードを使用して指定できます。
用語ベクトルはデフォルトでリアルタイムであり、ほぼリアルタイムではありません。これは、realtime
パラメータをfalse
に設定することで変更できます。
用語情報、用語統計、およびフィールド統計の3種類の値をリクエストできます。デフォルトでは、すべてのフィールドに対してすべての用語情報とフィールド統計が返されますが、用語統計は除外されます。
Term information
- フィールド内の用語頻度(常に返される)
- 用語の位置(
positions
: true) - 開始および終了オフセット(
offsets
: true) - 用語ペイロード(
payloads
: true)、base64エンコードされたバイト
要求された情報がインデックスに保存されていない場合、可能であればその場で計算されます。さらに、インデックスに存在しないドキュメントに対しても用語ベクトルを計算できますが、これはユーザーによって提供されます。
開始および終了オフセットはUTF-16エンコーディングが使用されていると仮定します。このトークンを生成した元のテキストを取得するためにこれらのオフセットを使用したい場合、サブストリングを取得する文字列もUTF-16でエンコードされていることを確認する必要があります。
Term statistics
- 総用語頻度(用語がすべてのドキュメントに出現する回数)
- ドキュメント頻度(現在の用語を含むドキュメントの数)
デフォルトでは、これらの値は返されません。用語統計はパフォーマンスに深刻な影響を与える可能性があるためです。
### Field statistics
`````field_statistics`````を`````false`````に設定すると(デフォルトは`````true`````)、次の項目が省略されます:
- ドキュメント数(このフィールドを含むドキュメントの数)
- ドキュメント頻度の合計(このフィールド内のすべての用語のドキュメント頻度の合計)
- 総用語頻度の合計(このフィールド内の各用語の総用語頻度の合計)
### Terms filtering
`````filter`````パラメータを使用すると、返される用語はtf-idfスコアに基づいてフィルタリングされる可能性があります。これは、ドキュメントの良好な特徴ベクトルを見つけるのに役立ちます。この機能は、[More Like This Query](/read/elasticsearch-8-15/8cd48cd8651d82ff.md)の[第2フェーズ](8cd48cd8651d82ff.md#mlt-query-term-selection)と同様の方法で機能します。使用法については[例5](5cf2fae1b45c0ba1.md#docs-termvectors-terms-filtering)を参照してください。
次のサブパラメータがサポートされています:
| | |
| --- | --- |
| `````max_num_terms````` | フィールドごとに返される必要がある最大用語数。デフォルトは`````25`````です。 |
| `````min_term_freq````` | ソースドキュメント内でこの頻度未満の単語を無視します。デフォルトは`````1`````です。 |
| `````max_term_freq````` | ソースドキュメント内でこの頻度を超える単語を無視します。デフォルトは無制限です。 |
| `````min_doc_freq````` | この数のドキュメントに出現しない用語を無視します。デフォルトは`````1`````です。 |
| `````max_doc_freq````` | この数のドキュメントに出現する単語を無視します。デフォルトは無制限です。 |
| `````min_word_length````` | 無視される単語の最小文字数。デフォルトは`````0`````です。 |
| `````max_word_length````` | 無視される単語の最大文字数。デフォルトは無制限(`````0`````)です。 |
## Behaviour
用語およびフィールド統計は正確ではありません。削除されたドキュメントは考慮されません。情報は、要求されたドキュメントが存在するシャードのみに取得されます。したがって、用語およびフィールド統計は相対的な尺度としてのみ有用であり、絶対的な数値はこの文脈では意味を持ちません。デフォルトでは、人工ドキュメントの用語ベクトルを要求する際、統計を取得するためのシャードがランダムに選択されます。特定のシャードを指定するには`````routing`````を使用してください。
## Path parameters
- `````<index>
- (必須、文字列)ドキュメントを含むインデックスの名前。
<_id>
- (オプション、文字列)ドキュメントの一意の識別子。
Query parameters
fields
- (オプション、文字列)統計に含めるフィールドのカンマ区切りリストまたはワイルドカード式。
completion_fields
またはfielddata_fields
パラメータで特定のフィールドリストが提供されない限り、デフォルトリストとして使用されます。 field_statistics
- (オプション、ブール値)
true
の場合、応答にはドキュメント数、ドキュメント頻度の合計、および総用語頻度の合計が含まれます。デフォルトはtrue
です。 <offsets>
- (オプション、ブール値)
true
の場合、応答には用語オフセットが含まれます。デフォルトはtrue
です。 payloads
- (オプション、ブール値)
true
の場合、応答には用語ペイロードが含まれます。デフォルトはtrue
です。 positions
- (オプション、ブール値)
true
の場合、応答には用語位置が含まれます。デフォルトはtrue
です。 preference
- (オプション、文字列)操作を実行するノードまたはシャードを指定します。デフォルトはランダムです。
routing
- (オプション、文字列)特定のシャードに操作をルーティングするために使用されるカスタム値。
realtime
- (オプション、ブール値)
true
の場合、リクエストはリアルタイムであり、ほぼリアルタイムではありません。デフォルトはtrue
です。リアルタイムを参照してください。 term_statistics
- (オプション、ブール値)
true
の場合、応答には用語頻度とドキュメント頻度が含まれます。デフォルトはfalse
です。 version
- (オプション、ブール値)
true
の場合、ヒットの一部としてドキュメントバージョンを返します。 version_type
- (オプション、列挙型)特定のバージョンタイプ:
external
、external_gte
。
Examples
Returning stored term vectors
まず、用語ベクトル、ペイロードなどを保存するインデックスを作成します:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"text": {
"type": "text",
"term_vector": "with_positions_offsets_payloads",
"store": True,
"analyzer": "fulltext_analyzer"
},
"fullname": {
"type": "text",
"term_vector": "with_positions_offsets_payloads",
"analyzer": "fulltext_analyzer"
}
}
},
settings={
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"analysis": {
"analyzer": {
"fulltext_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"type_as_payload"
]
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
text: {
type: 'text',
term_vector: 'with_positions_offsets_payloads',
store: true,
analyzer: 'fulltext_analyzer'
},
fullname: {
type: 'text',
term_vector: 'with_positions_offsets_payloads',
analyzer: 'fulltext_analyzer'
}
}
},
settings: {
index: {
number_of_shards: 1,
number_of_replicas: 0
},
analysis: {
analyzer: {
fulltext_analyzer: {
type: 'custom',
tokenizer: 'whitespace',
filter: [
'lowercase',
'type_as_payload'
]
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
text: {
type: "text",
term_vector: "with_positions_offsets_payloads",
store: true,
analyzer: "fulltext_analyzer",
},
fullname: {
type: "text",
term_vector: "with_positions_offsets_payloads",
analyzer: "fulltext_analyzer",
},
},
},
settings: {
index: {
number_of_shards: 1,
number_of_replicas: 0,
},
analysis: {
analyzer: {
fulltext_analyzer: {
type: "custom",
tokenizer: "whitespace",
filter: ["lowercase", "type_as_payload"],
},
},
},
},
});
console.log(response);
Console
PUT /my-index-000001
{ "mappings": {
"properties": {
"text": {
"type": "text",
"term_vector": "with_positions_offsets_payloads",
"store" : true,
"analyzer" : "fulltext_analyzer"
},
"fullname": {
"type": "text",
"term_vector": "with_positions_offsets_payloads",
"analyzer" : "fulltext_analyzer"
}
}
},
"settings" : {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 0
},
"analysis": {
"analyzer": {
"fulltext_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"type_as_payload"
]
}
}
}
}
}
次に、いくつかのドキュメントを追加します:
Python
resp = client.index(
index="my-index-000001",
id="1",
document={
"fullname": "John Doe",
"text": "test test test "
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="2",
refresh="wait_for",
document={
"fullname": "Jane Doe",
"text": "Another test ..."
},
)
print(resp1)
Ruby
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
fullname: 'John Doe',
text: 'test test test '
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
refresh: 'wait_for',
body: {
fullname: 'Jane Doe',
text: 'Another test ...'
}
)
puts response
Js
const response = await client.index({
index: "my-index-000001",
id: 1,
document: {
fullname: "John Doe",
text: "test test test ",
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 2,
refresh: "wait_for",
document: {
fullname: "Jane Doe",
text: "Another test ...",
},
});
console.log(response1);
Console
PUT /my-index-000001/_doc/1
{
"fullname" : "John Doe",
"text" : "test test test "
}
PUT /my-index-000001/_doc/2?refresh=wait_for
{
"fullname" : "Jane Doe",
"text" : "Another test ..."
}
次のリクエストは、ドキュメント1
(ジョン・ドー)のフィールドtext
に関するすべての情報と統計を返します:
Python
resp = client.termvectors(
index="my-index-000001",
id="1",
fields=[
"text"
],
offsets=True,
payloads=True,
positions=True,
term_statistics=True,
field_statistics=True,
)
print(resp)
Ruby
response = client.termvectors(
index: 'my-index-000001',
id: 1,
body: {
fields: [
'text'
],
offsets: true,
payloads: true,
positions: true,
term_statistics: true,
field_statistics: true
}
)
puts response
Js
const response = await client.termvectors({
index: "my-index-000001",
id: 1,
fields: ["text"],
offsets: true,
payloads: true,
positions: true,
term_statistics: true,
field_statistics: true,
});
console.log(response);
Console
GET /my-index-000001/_termvectors/1
{
"fields" : ["text"],
"offsets" : true,
"payloads" : true,
"positions" : true,
"term_statistics" : true,
"field_statistics" : true
}
Console-Result
{
"_index": "my-index-000001",
"_id": "1",
"_version": 1,
"found": true,
"took": 6,
"term_vectors": {
"text": {
"field_statistics": {
"sum_doc_freq": 4,
"doc_count": 2,
"sum_ttf": 6
},
"terms": {
"test": {
"doc_freq": 2,
"ttf": 4,
"term_freq": 3,
"tokens": [
{
"position": 0,
"start_offset": 0,
"end_offset": 4,
"payload": "d29yZA=="
},
{
"position": 1,
"start_offset": 5,
"end_offset": 9,
"payload": "d29yZA=="
},
{
"position": 2,
"start_offset": 10,
"end_offset": 14,
"payload": "d29yZA=="
}
]
}
}
}
}
}
Generating term vectors on the fly
インデックスに明示的に保存されていない用語ベクトルは、自動的にその場で計算されます。次のリクエストは、ドキュメント1
のフィールドに関するすべての情報と統計を返しますが、用語はインデックスに明示的に保存されていません。フィールドtext
については、用語は再生成されません。
Python
resp = client.termvectors(
index="my-index-000001",
id="1",
fields=[
"text",
"some_field_without_term_vectors"
],
offsets=True,
positions=True,
term_statistics=True,
field_statistics=True,
)
print(resp)
Ruby
response = client.termvectors(
index: 'my-index-000001',
id: 1,
body: {
fields: [
'text',
'some_field_without_term_vectors'
],
offsets: true,
positions: true,
term_statistics: true,
field_statistics: true
}
)
puts response
Js
const response = await client.termvectors({
index: "my-index-000001",
id: 1,
fields: ["text", "some_field_without_term_vectors"],
offsets: true,
positions: true,
term_statistics: true,
field_statistics: true,
});
console.log(response);
Console
GET /my-index-000001/_termvectors/1
{
"fields" : ["text", "some_field_without_term_vectors"],
"offsets" : true,
"positions" : true,
"term_statistics" : true,
"field_statistics" : true
}
Artificial documents
用語ベクトルは、インデックスに存在しない人工ドキュメントに対しても生成できます。たとえば、次のリクエストは、例1と同じ結果を返します。使用されるマッピングはindex
によって決まります。
動的マッピングがオンになっている場合(デフォルト)、元の
マッピングにないドキュメントフィールドは動的に作成されます。
Python
resp = client.termvectors(
index="my-index-000001",
doc={
"fullname": "John Doe",
"text": "test test test"
},
)
print(resp)
Ruby
response = client.termvectors(
index: 'my-index-000001',
body: {
doc: {
fullname: 'John Doe',
text: 'test test test'
}
}
)
puts response
Js
const response = await client.termvectors({
index: "my-index-000001",
doc: {
fullname: "John Doe",
text: "test test test",
},
});
console.log(response);
Console
GET /my-index-000001/_termvectors
{
"doc" : {
"fullname" : "John Doe",
"text" : "test test test"
}
}
Per-field analyzer
さらに、per_field_analyzer
パラメータを使用して、フィールドのものとは異なるアナライザーを提供できます。これは、特に人工ドキュメントを使用する場合に、任意の方法で用語ベクトルを生成するのに役立ちます。用語ベクトルをすでに保存しているフィールドにアナライザーを提供する場合、用語ベクトルは再生成されます。
Python
resp = client.termvectors(
index="my-index-000001",
doc={
"fullname": "John Doe",
"text": "test test test"
},
fields=[
"fullname"
],
per_field_analyzer={
"fullname": "keyword"
},
)
print(resp)
Ruby
response = client.termvectors(
index: 'my-index-000001',
body: {
doc: {
fullname: 'John Doe',
text: 'test test test'
},
fields: [
'fullname'
],
per_field_analyzer: {
fullname: 'keyword'
}
}
)
puts response
Js
const response = await client.termvectors({
index: "my-index-000001",
doc: {
fullname: "John Doe",
text: "test test test",
},
fields: ["fullname"],
per_field_analyzer: {
fullname: "keyword",
},
});
console.log(response);
Console
GET /my-index-000001/_termvectors
{
"doc" : {
"fullname" : "John Doe",
"text" : "test test test"
},
"fields": ["fullname"],
"per_field_analyzer" : {
"fullname": "keyword"
}
}
Console-Result
{
"_index": "my-index-000001",
"_version": 0,
"found": true,
"took": 6,
"term_vectors": {
"fullname": {
"field_statistics": {
"sum_doc_freq": 2,
"doc_count": 4,
"sum_ttf": 4
},
"terms": {
"John Doe": {
"term_freq": 1,
"tokens": [
{
"position": 0,
"start_offset": 0,
"end_offset": 8
}
]
}
}
}
}
}
Terms filtering
最後に、返される用語はtf-idfスコアに基づいてフィルタリングされる可能性があります。以下の例では、与えられた「プロット」フィールド値を持つ人工ドキュメントから、最も「興味深い」3つのキーワードを取得します。キーワード「トニー」やその他のストップワードは、tf-idfが低すぎるため、応答の一部ではありません。
Python
resp = client.termvectors(
index="imdb",
doc={
"plot": "When wealthy industrialist Tony Stark is forced to build an armored suit after a life-threatening incident, he ultimately decides to use its technology to fight against evil."
},
term_statistics=True,
field_statistics=True,
positions=False,
offsets=False,
filter={
"max_num_terms": 3,
"min_term_freq": 1,
"min_doc_freq": 1
},
)
print(resp)
Ruby
response = client.termvectors(
index: 'imdb',
body: {
doc: {
plot: 'When wealthy industrialist Tony Stark is forced to build an armored suit after a life-threatening incident, he ultimately decides to use its technology to fight against evil.'
},
term_statistics: true,
field_statistics: true,
positions: false,
offsets: false,
filter: {
max_num_terms: 3,
min_term_freq: 1,
min_doc_freq: 1
}
}
)
puts response
Js
const response = await client.termvectors({
index: "imdb",
doc: {
plot: "When wealthy industrialist Tony Stark is forced to build an armored suit after a life-threatening incident, he ultimately decides to use its technology to fight against evil.",
},
term_statistics: true,
field_statistics: true,
positions: false,
offsets: false,
filter: {
max_num_terms: 3,
min_term_freq: 1,
min_doc_freq: 1,
},
});
console.log(response);
Console
GET /imdb/_termvectors
{
"doc": {
"plot": "When wealthy industrialist Tony Stark is forced to build an armored suit after a life-threatening incident, he ultimately decides to use its technology to fight against evil."
},
"term_statistics": true,
"field_statistics": true,
"positions": false,
"offsets": false,
"filter": {
"max_num_terms": 3,
"min_term_freq": 1,
"min_doc_freq": 1
}
}
Console-Result
{
"_index": "imdb",
"_version": 0,
"found": true,
"term_vectors": {
"plot": {
"field_statistics": {
"sum_doc_freq": 3384269,
"doc_count": 176214,
"sum_ttf": 3753460
},
"terms": {
"armored": {
"doc_freq": 27,
"ttf": 27,
"term_freq": 1,
"score": 9.74725
},
"industrialist": {
"doc_freq": 88,
"ttf": 88,
"term_freq": 1,
"score": 8.590818
},
"stark": {
"doc_freq": 44,
"ttf": 47,
"term_freq": 1,
"score": 9.272792
}
}
}
}
}