ワードデリミタートークンフィルター
word_delimiter_graph
フィルターを word_delimiter
フィルターの代わりに使用することをお勧めします。
word_delimiter
フィルターは無効なトークングラフを生成する可能性があります。 word_delimiter_graph
と word_delimiter
の違い を参照してください。
word_delimiter
フィルターは、非推奨としてマークされた Lucene の WordDelimiterFilter も使用します。
非英数字文字でトークンを分割します。 word_delimiter
フィルターは、ルールのセットに基づいてオプションのトークン正規化も実行します。 デフォルトでは、フィルターは次のルールを使用します:
- 非英数字文字でトークンを分割します。 フィルターはこれらの文字をデリミタとして使用します。 例えば:
Super-Duper
→Super
,Duper
- 各トークンの先頭または末尾のデリミタを削除します。 例えば:
XL---42+'Autocoder'
→XL
,42
,Autocoder
- 大文字小文字の変遷でトークンを分割します。 例えば:
PowerShot
→Power
,Shot
- 文字と数字の変遷でトークンを分割します。 例えば:
XL500
→XL
,500
- 各トークンの末尾から英語の所有格 (
's
) を削除します。 例えば:Neil's
→Neil
word_delimiter
フィルターは、製品 ID や部品番号などの複雑な識別子から句読点を削除するために設計されました。 これらのユースケースには、[word_delimiter
] フィルターと keyword
トークナイザーを使用することをお勧めします。
word_delimiter
フィルターを使用してハイフン付きの単語を分割することは避けてください。 例えば wi-fi
。 ユーザーはこれらの単語をハイフンありとなしの両方で検索することが多いため、synonym_graph
フィルターを代わりに使用することをお勧めします。
例
次の analyze API リクエストは、word_delimiter
フィルターを使用して Neil's-Super-Duper-XL500--42+AutoCoder
をフィルターのデフォルトルールを使用して正規化されたトークンに分割します:
Python
resp = client.indices.analyze(
tokenizer="keyword",
filter=[
"word_delimiter"
],
text="Neil's-Super-Duper-XL500--42+AutoCoder",
)
print(resp)
Ruby
response = client.indices.analyze(
body: {
tokenizer: 'keyword',
filter: [
'word_delimiter'
],
text: "Neil's-Super-Duper-XL500--42+AutoCoder"
}
)
puts response
Js
const response = await client.indices.analyze({
tokenizer: "keyword",
filter: ["word_delimiter"],
text: "Neil's-Super-Duper-XL500--42+AutoCoder",
});
console.log(response);
コンソール
GET /_analyze
{
"tokenizer": "keyword",
"filter": [ "word_delimiter" ],
"text": "Neil's-Super-Duper-XL500--42+AutoCoder"
}
フィルターは次のトークンを生成します:
Txt
[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]
アナライザーに追加
次の create index API リクエストは、word_delimiter
フィルターを使用して新しい カスタムアナライザー を構成します。
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"word_delimiter"
]
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'keyword',
filter: [
'word_delimiter'
]
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "keyword",
filter: ["word_delimiter"],
},
},
},
},
});
console.log(response);
コンソール
PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [ "word_delimiter" ]
}
}
}
}
}
word_delimiter
フィルターを、standard
トークナイザーのように句読点を削除するトークナイザーと一緒に使用することは避けてください。 これにより、word_delimiter
フィルターがトークンを正しく分割できなくなる可能性があります。 また、catenate_all
や preserve_original
などのフィルターの設定可能なパラメータに干渉する可能性があります。 代わりに、keyword
または whitespace
トークナイザーを使用することをお勧めします。
設定可能なパラメータ
catenate_all
- (オプション、ブール値)
true
の場合、フィルターは非アルファベットデリミタで区切られた英数字の文字のチェーンに対して連結トークンを生成します。 例えば:super-duper-xl-500
→ [super
,superduperxl500
,duper
,xl
,500
]。 デフォルトはfalse
です。
検索分析に使用される場合、連結トークンはmatch_phrase
クエリやトークン位置に依存する他のクエリに問題を引き起こす可能性があります。 これらのクエリを使用する予定がある場合は、このパラメータをtrue
に設定しないでください。 catenate_numbers
- (オプション、ブール値)
true
の場合、フィルターは非アルファベットデリミタで区切られた数字の文字のチェーンに対して連結トークンを生成します。 例えば:01-02-03
→ [01
,010203
,02
,03
]。 デフォルトはfalse
です。
検索分析に使用される場合、連結トークンはmatch_phrase
クエリやトークン位置に依存する他のクエリに問題を引き起こす可能性があります。 これらのクエリを使用する予定がある場合は、このパラメータをtrue
に設定しないでください。 catenate_words
- (オプション、ブール値)
true
の場合、フィルターは非アルファベットデリミタで区切られたアルファベットの文字のチェーンに対して連結トークンを生成します。 例えば:super-duper-xl
→ [super
,superduperxl
,duper
,xl
]。 デフォルトはfalse
です。
検索分析に使用される場合、連結トークンはmatch_phrase
クエリやトークン位置に依存する他のクエリに問題を引き起こす可能性があります。 これらのクエリを使用する予定がある場合は、このパラメータをtrue
に設定しないでください。 generate_number_parts
- (オプション、ブール値)
true
の場合、フィルターは出力に数字のみからなるトークンを含めます。false
の場合、フィルターはこれらのトークンを出力から除外します。 デフォルトはtrue
です。 generate_word_parts
- (オプション、ブール値)
true
の場合、フィルターは出力にアルファベットのみからなるトークンを含めます。false
の場合、フィルターはこれらのトークンを出力から除外します。 デフォルトはtrue
です。 preserve_original
- (オプション、ブール値)
true
の場合、フィルターは出力に分割されたトークンの元のバージョンを含めます。 この元のバージョンには非英数字デリミタが含まれます。 例えば:super-duper-xl-500
→ [super-duper-xl-500
,super
,duper
,xl
,500
]。 デフォルトはfalse
です。 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 =
サポートされているタイプには次のものが含まれます:
ALPHA
(アルファベット)ALPHANUM
(アルファベットと数字)DIGIT
(数字)LOWER
(小文字のアルファベット)SUBWORD_DELIM
(非アルファベットデリミタ)UPPER
(大文字のアルファベット)
このファイルパスはconfig
の場所に対する絶対パスまたは相対パスでなければならず、ファイルは UTF-8 エンコードされている必要があります。 ファイル内の各マッピングは改行で区切られている必要があります。
カスタマイズ
word_delimiter
フィルターをカスタマイズするには、それを複製して新しいカスタムトークンフィルターの基礎を作成します。 設定可能なパラメータを使用してフィルターを変更できます。
例えば、次のリクエストは、次のルールを使用して word_delimiter
フィルターを作成します:
- ハイフン (
-
) 文字を除いて、非アルファベット文字でトークンを分割します。 - 各トークンの先頭または末尾のデリミタを削除します。
- 大文字小文字の変遷でトークンを分割しません。
- 文字と数字の変遷でトークンを分割しません。
- 各トークンの末尾から英語の所有格 (
's
) を削除します。
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"my_custom_word_delimiter_filter"
]
}
},
"filter": {
"my_custom_word_delimiter_filter": {
"type": "word_delimiter",
"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_filter'
]
}
},
filter: {
my_custom_word_delimiter_filter: {
type: 'word_delimiter',
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_filter"],
},
},
filter: {
my_custom_word_delimiter_filter: {
type: "word_delimiter",
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_filter" ]
}
},
"filter": {
"my_custom_word_delimiter_filter": {
"type": "word_delimiter",
"type_table": [ "- => ALPHA" ],
"split_on_case_change": false,
"split_on_numerics": false,
"stem_english_possessive": true
}
}
}
}
}