文字フィルターのマッピング
mapping
文字フィルターは、キーと値のマップを受け入れます。キーと同じ文字列に出会うと、それをそのキーに関連付けられた値に置き換えます。
マッチングは貪欲であり、特定のポイントで最も長いパターンが勝ちます。置き換えは空の文字列であることも許可されます。
mapping
フィルターは、Lucene の MappingCharFilter を使用します。
例
次の analyze API リクエストは、mapping
フィルターを使用して、ヒンドゥー・アラビア数字 (٠١٢٣٤٥٦٧٨٩) をアラビア・ラテン数字 (0123456789) に変換し、テキスト My license plate is ٢٥٠١٥
を My license plate is 25015
に変更します。
Python
resp = client.indices.analyze(
tokenizer="keyword",
char_filter=[
{
"type": "mapping",
"mappings": [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4",
"٥ => 5",
"٦ => 6",
"٧ => 7",
"٨ => 8",
"٩ => 9"
]
}
],
text="My license plate is ٢٥٠١٥",
)
print(resp)
Ruby
response = client.indices.analyze(
body: {
tokenizer: 'keyword',
char_filter: [
{
type: 'mapping',
mappings: [
'٠ => 0',
'١ => 1',
'٢ => 2',
'٣ => 3',
'٤ => 4',
'٥ => 5',
'٦ => 6',
'٧ => 7',
'٨ => 8',
'٩ => 9'
]
}
],
text: 'My license plate is ٢٥٠١٥'
}
)
puts response
Js
const response = await client.indices.analyze({
tokenizer: "keyword",
char_filter: [
{
type: "mapping",
mappings: [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4",
"٥ => 5",
"٦ => 6",
"٧ => 7",
"٨ => 8",
"٩ => 9",
],
},
],
text: "My license plate is ٢٥٠١٥",
});
console.log(response);
コンソール
GET /_analyze
{
"tokenizer": "keyword",
"char_filter": [
{
"type": "mapping",
"mappings": [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4",
"٥ => 5",
"٦ => 6",
"٧ => 7",
"٨ => 8",
"٩ => 9"
]
}
],
"text": "My license plate is ٢٥٠١٥"
}
フィルターは次のテキストを生成します:
テキスト
[ My license plate is 25015 ]
設定可能なパラメータ
mappings
- (必須*, 文字列の配列) 各要素が
key => value
の形式を持つマッピングの配列。
このいずれか、またはmappings_path
パラメータを指定する必要があります。 mappings_path
- (必須*, 文字列)
key => value
マッピングを含むファイルへのパス。
このパスは絶対パスまたはconfig
の場所に対する相対パスでなければならず、ファイルは UTF-8 エンコードされている必要があります。ファイル内の各マッピングは改行で区切られている必要があります。
このいずれか、またはmappings
パラメータを指定する必要があります。
アナライザーのカスタマイズと追加
mappings
フィルターをカスタマイズするには、それを複製して新しいカスタム文字フィルターの基礎を作成します。設定可能なパラメータを使用してフィルターを変更できます。
次の create index API リクエストは、カスタム mappings
フィルター my_mappings_char_filter
を使用して新しい カスタムアナライザー を構成します。
my_mappings_char_filter
フィルターは、:)
および :(
絵文字をテキストの同等物に置き換えます。
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_mappings_char_filter"
]
}
},
"char_filter": {
"my_mappings_char_filter": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'standard',
char_filter: [
'my_mappings_char_filter'
]
}
},
char_filter: {
my_mappings_char_filter: {
type: 'mapping',
mappings: [
':) => _happy_',
':( => _sad_'
]
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "standard",
char_filter: ["my_mappings_char_filter"],
},
},
char_filter: {
my_mappings_char_filter: {
type: "mapping",
mappings: [":) => _happy_", ":( => _sad_"],
},
},
},
},
});
console.log(response);
コンソール
PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_mappings_char_filter"
]
}
},
"char_filter": {
"my_mappings_char_filter": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
}
}
}
}
次の analyze API リクエストは、カスタム my_mappings_char_filter
を使用して、テキスト I'm delighted about it :(
内の :(
を _sad_
に置き換えます。
Python
resp = client.indices.analyze(
index="my-index-000001",
tokenizer="keyword",
char_filter=[
"my_mappings_char_filter"
],
text="I'm delighted about it :(",
)
print(resp)
Js
const response = await client.indices.analyze({
index: "my-index-000001",
tokenizer: "keyword",
char_filter: ["my_mappings_char_filter"],
text: "I'm delighted about it :(",
});
console.log(response);
コンソール
GET /my-index-000001/_analyze
{
"tokenizer": "keyword",
"char_filter": [ "my_mappings_char_filter" ],
"text": "I'm delighted about it :("
}
フィルターは次のテキストを生成します:
テキスト
[ I'm delighted about it _sad_ ]