ワードデリミタグラフトークンフィルタ
非英数字文字でトークンを分割します。word_delimiter_graph
フィルタは、ルールのセットに基づいてオプションのトークン正規化も行います。デフォルトでは、フィルタは以下のルールを使用します:
- 非英数字文字でトークンを分割します。フィルタはこれらの文字をデリミタとして使用します。例えば:
Super-Duper
→Super
、Duper
- 各トークンの先頭または末尾のデリミタを削除します。例えば:
XL---42+'Autocoder'
→XL
、42
、Autocoder
- 大文字小文字の変遷でトークンを分割します。例えば:
PowerShot
→Power
、Shot
- 文字と数字の変遷でトークンを分割します。例えば:
XL500
→XL
、500
- 各トークンの末尾から英語の所有格(
's
)を削除します。例えば:Neil's
→Neil
`````word_delimiter_graph`````フィルタは、製品IDや部品番号などの複雑な識別子から句読点を削除するために設計されました。これらの使用ケースには、[`````word_delimiter_graph`````](/read/elasticsearch-8-15/ec2a5f33a39f9570.md)トークナイザと一緒に`````keyword`````フィルタを使用することをお勧めします。
`````word_delimiter_graph`````フィルタを使用してハイフン付きの単語を分割することは避けてください。例えば`````wi-fi`````。ユーザーはこれらの単語をハイフンありとなしの両方で検索することが多いため、[`````synonym_graph`````](/read/elasticsearch-8-15/3f6bd695a88ef692.md)フィルタを代わりに使用することをお勧めします。
## 例
以下の[analyze API](/read/elasticsearch-8-15/1a51b9d359d8a54c.md)リクエストは、`````word_delimiter_graph`````フィルタを使用して`````Neil's-Super-Duper-XL500--42+AutoCoder`````をフィルタのデフォルトルールを使用して正規化されたトークンに分割します:
#### Python
``````python
resp = client.indices.analyze(
tokenizer="keyword",
filter=[
"word_delimiter_graph"
],
text="Neil's-Super-Duper-XL500--42+AutoCoder",
)
print(resp)
`
Ruby
response = client.indices.analyze(
body: {
tokenizer: 'keyword',
filter: [
'word_delimiter_graph'
],
text: "Neil's-Super-Duper-XL500--42+AutoCoder"
}
)
puts response
Js
const response = await client.indices.analyze({
tokenizer: "keyword",
filter: ["word_delimiter_graph"],
text: "Neil's-Super-Duper-XL500--42+AutoCoder",
});
console.log(response);
コンソール
GET /_analyze
{
"tokenizer": "keyword",
"filter": [ "word_delimiter_graph" ],
"text": "Neil's-Super-Duper-XL500--42+AutoCoder"
}
フィルタは以下のトークンを生成します:
Txt
[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]
アナライザーに追加
以下のcreate index APIリクエストは、word_delimiter_graph
フィルタを使用して新しいカスタムアナライザーを構成します。
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"word_delimiter_graph"
]
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'keyword',
filter: [
'word_delimiter_graph'
]
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "keyword",
filter: ["word_delimiter_graph"],
},
},
},
},
});
console.log(response);
コンソール
PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [ "word_delimiter_graph" ]
}
}
}
}
}
## 設定可能なパラメータ
[](#word-delimiter-graph-tokenfilter-adjust-offsets)
- `````adjust_offsets
(オプション、ブール値)
true
の場合、フィルタはトークンストリーム内の実際の位置をよりよく反映するように分割または連結されたトークンのオフセットを調整します。デフォルトはtrue
です。
アナライザーがtrim
フィルタのように、オフセットを変更せずにトークンの長さを変更するフィルタを使用する場合は、adjust_offsets
をfalse
に設定してください。そうしないと、word_delimiter_graph
フィルタが不正なオフセットを持つトークンを生成する可能性があります。catenate_all
(オプション、ブール値)
true
の場合、フィルタは非アルファベットデリミタで区切られた英数字の文字列の連結トークンを生成します。例えば:super-duper-xl-500
→ [superduperxl500
,super
,duper
,xl
,500
]。デフォルトはfalse
です。
このパラメータをtrue
に設定すると、インデックス作成にサポートされていないマルチポジショントークンが生成されます。
このパラメータがtrue
の場合、インデックスアナライザーでこのフィルタを使用することは避けるか、このフィルタの後にflatten_graph
フィルタを使用してトークンストリームをインデックス作成に適したものにしてください。
検索分析に使用される場合、連結トークンはmatch_phrase
クエリやトークン位置に依存する他のクエリに問題を引き起こす可能性があります。これらのクエリを使用する予定がある場合は、このパラメータをtrue
に設定しないでください。catenate_numbers
(オプション、ブール値)
true
の場合、フィルタは非アルファベットデリミタで区切られた数字の文字列の連結トークンを生成します。例えば:01-02-03
→ [010203
,01
,02
,03
]。デフォルトはfalse
です。
このパラメータをtrue
に設定すると、インデックス作成にサポートされていないマルチポジショントークンが生成されます。
このパラメータがtrue
の場合、インデックスアナライザーでこのフィルタを使用することは避けるか、このフィルタの後にflatten_graph
フィルタを使用してトークンストリームをインデックス作成に適したものにしてください。
検索分析に使用される場合、連結トークンはmatch_phrase
クエリやトークン位置に依存する他のクエリに問題を引き起こす可能性があります。これらのクエリを使用する予定がある場合は、このパラメータをtrue
に設定しないでください。catenate_words
- (オプション、ブール値)
true
の場合、フィルタは非アルファベットデリミタで区切られたアルファベットの文字列の連結トークンを生成します。例えば:super-duper-xl
→ [superduperxl
,super
,duper
,xl
]。デフォルトはfalse
です。
このパラメータをtrue
に設定すると、インデックス作成にサポートされていないマルチポジショントークンが生成されます。
このパラメータがtrue
の場合、インデックスアナライザーでこのフィルタを使用することは避けるか、このフィルタの後にflatten_graph
フィルタを使用してトークンストリームをインデックス作成に適したものにしてください。
検索分析に使用される場合、連結トークンはmatch_phrase
クエリやトークン位置に依存する他のクエリに問題を引き起こす可能性があります。これらのクエリを使用する予定がある場合は、このパラメータをtrue
に設定しないでください。 generate_number_parts
- (オプション、ブール値)
true
の場合、フィルタは出力に数値文字のみで構成されるトークンを含めます。false
の場合、フィルタはこれらのトークンを出力から除外します。デフォルトはtrue
です。 generate_word_parts
- (オプション、ブール値)
true
の場合、フィルタは出力にアルファベット文字のみで構成されるトークンを含めます。false
の場合、フィルタはこれらのトークンを出力から除外します。デフォルトはtrue
です。 ignore_keywords
(オプション、ブール値)
true
の場合、フィルタはkeyword
属性がtrue
のトークンをスキップします。デフォルトはfalse
です。preserve_original
- (オプション、ブール値)
true
の場合、フィルタは出力に分割されたトークンの元のバージョンを含めます。この元のバージョンには非英数字デリミタが含まれます。例えば:super-duper-xl-500
→ [super-duper-xl-500
,super
,duper
,xl
,500
]。デフォルトはfalse
です。
このパラメータをtrue
に設定すると、インデックス作成にサポートされていないマルチポジショントークンが生成されます。
このパラメータがtrue
の場合、インデックスアナライザーでこのフィルタを使用することは避けるか、このフィルタの後にflatten_graph
フィルタを使用してトークンストリームをインデックス作成に適したものにしてください。 protected_words
- (オプション、文字列の配列) フィルタが分割しないトークンの配列。
protected_words_path
- (オプション、文字列) フィルタが分割しないトークンのリストを含むファイルへのパス。
このパスは絶対パスまたはconfig
の場所に対する相対パスでなければならず、ファイルはUTF-8エンコードされている必要があります。ファイル内の各トークンは改行で区切られている必要があります。 split_on_case_change
- (オプション、ブール値)
true
の場合、フィルタは大文字小文字の変遷でトークンを分割します。例えば:camelCase
→ [camel
,Case
]。デフォルトはtrue
です。 split_on_numerics
- (オプション、ブール値)
true
の場合、フィルタは文字と数字の変遷でトークンを分割します。例えば:j2se
→ [j
,2
,se
]。デフォルトはtrue
です。 stem_english_possessive
- (オプション、ブール値)
true
の場合、フィルタは各トークンの末尾から英語の所有格('s
)を削除します。例えば:O'Neil's
→ [O
,Neil
]。デフォルトはtrue
です。 type_table
- (オプション、文字列の配列) 文字のカスタムタイプマッピングの配列。これにより、非英数字文字を数値または英数字としてマッピングして、それらの文字で分割されないようにすることができます。
例えば、以下の配列はプラス(+
)とハイフン(-
)文字を英数字としてマッピングし、デリミタとして扱われないことを意味します:[ "+ => ALPHA", "- => ALPHA" ]
サポートされているタイプには次のものが含まれます:ALPHA
(アルファベット)ALPHANUM
(英数字)DIGIT
(数値)LOWER
(小文字アルファベット)SUBWORD_DELIM
(非英数字デリミタ)UPPER
(大文字アルファベット)
type_table_path
- (オプション、文字列) 文字のカスタムタイプマッピングを含むファイルへのパス。これにより、非英数字文字を数値または英数字としてマッピングして、それらの文字で分割されないようにすることができます。
例えば、このファイルの内容には次のようなものが含まれる場合があります:
Txt
# $、%、。および、文字をDIGITにマッピング
# これは財務データに役立つかもしれません。
$ =
% =
. =
\\u002C =
# 場合によってはZWJで分割したくないことがあります
# これは、より大きなbyte[]が必要なケースもテストします。
# https://en.wikipedia.org/wiki/Zero-width_joinerを参照してください
\\u200D =
ALPHANUM
サポートされているタイプには次のものが含まれます:
ALPHA
(アルファベット)ALPHANUM
(英数字)DIGIT
(数値)LOWER
(小文字アルファベット)SUBWORD_DELIM
(非英数字デリミタ)UPPER
(大文字アルファベット)
このファイルパスはconfig
の場所に対する絶対パスまたは相対パスでなければならず、ファイルはUTF-8エンコードされている必要があります。ファイル内の各マッピングは改行で区切られている必要があります。
カスタマイズ
例えば、以下のリクエストは、次のルールを使用する`````word_delimiter_graph`````フィルタを作成します:
- ハイフン(`````-`````)文字を除く非英数字文字でトークンを分割します。
- 各トークンの先頭または末尾のデリミタを削除します。
- 大文字小文字の変遷でトークンを分割しません。
- 文字と数字の変遷でトークンを分割しません。
- 各トークンの末尾から英語の所有格(`````'s`````)を削除します。
#### Python
``````python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"my_custom_word_delimiter_graph_filter"
]
}
},
"filter": {
"my_custom_word_delimiter_graph_filter": {
"type": "word_delimiter_graph",
"type_table": [
"- => ALPHA"
],
"split_on_case_change": False,
"split_on_numerics": False,
"stem_english_possessive": True
}
}
}
},
)
print(resp)
`
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'keyword',
filter: [
'my_custom_word_delimiter_graph_filter'
]
}
},
filter: {
my_custom_word_delimiter_graph_filter: {
type: 'word_delimiter_graph',
type_table: [
'- => ALPHA'
],
split_on_case_change: false,
split_on_numerics: false,
stem_english_possessive: true
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "keyword",
filter: ["my_custom_word_delimiter_graph_filter"],
},
},
filter: {
my_custom_word_delimiter_graph_filter: {
type: "word_delimiter_graph",
type_table: ["- => ALPHA"],
split_on_case_change: false,
split_on_numerics: false,
stem_english_possessive: true,
},
},
},
},
});
console.log(response);
コンソール
PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [ "my_custom_word_delimiter_graph_filter" ]
}
},
"filter": {
"my_custom_word_delimiter_graph_filter": {
"type": "word_delimiter_graph",
"type_table": [ "- => ALPHA" ],
"split_on_case_change": false,
"split_on_numerics": false,
"stem_english_possessive": true
}
}
}
}
}
word_delimiter_graphとword_delimiterの違い
word_delimiter_graph
とword_delimiter
フィルタは、以下のいずれかのパラメータがtrue
の場合、複数の位置にまたがるトークンを生成します:
しかし、word_delimiter_graph
フィルタのみがマルチポジショントークンにpositionLength
属性を割り当て、トークンが跨る位置の数を示します。これにより、word_delimiter_graph
フィルタは常に有効なtoken graphsを生成します。
word_delimiter
フィルタはマルチポジショントークンにpositionLength
属性を割り当てません。これは、これらのトークンを含むストリームに対して無効なグラフを生成することを意味します。
インデックス作成はマルチポジショントークンを含むトークングラフをサポートしていませんが、match_phrase
クエリのようなクエリは、これらのグラフを使用して単一のクエリ文字列から複数のサブクエリを生成できます。
word_delimiter
とword_delimiter_graph
フィルタによって生成されたトークングラフの違いを確認するには、以下の例を確認してください。
例
word_delimiter
とword_delimiter_graph
は、以下のパラメータがfalse
の場合、PowerShot2000
のために次のトークングラフを生成します:
このグラフにはマルチポジショントークンは含まれていません。すべてのトークンは1つの位置にのみまたがります。
word_delimiter_graph
グラフとマルチポジショントークン
word_delimiter_graph
フィルタは、PowerShot2000
のためにcatenate_words
がtrue
の場合、次のトークングラフを生成します。
このグラフは、連結されたPowerShot
トークンが2つの位置にまたがることを正しく示しています。
word_delimiter
グラフとマルチポジショントークン
catenate_words
がtrue
の場合、word_delimiter
フィルタはPowerShot2000
のために次のトークングラフを生成します。
連結されたPowerShot
トークンは2つの位置にまたがるべきですが、トークングラフでは1つの位置にしかまたがっておらず、無効になっています。