Фильтр токенов Shingle
Добавляет шинглы, или слово n-граммы, в поток токенов, конкатенируя смежные токены. По умолчанию, фильтр токенов shingle выводит шинглы из двух слов и униграммы.
Например, многие токенизаторы преобразуют the lazy dog в [ the, lazy, dog ]. Вы можете использовать фильтр shingle, чтобы добавить шинглы из двух слов в этот поток: [ the, the lazy, lazy, lazy dog, dog ].
Шинглы часто используются для ускорения запросов по фразам, таких как match_phrase. Вместо создания шинглов с помощью фильтра shingles, рекомендуется использовать параметр отображения index-phrases для соответствующего поля text.
Этот фильтр использует ShingleFilter Lucene.
Пример
Следующий запрос API analyze API использует фильтр shingle, чтобы добавить шинглы из двух слов в поток токенов для quick brown fox jumps:
resp = client.indices.analyze(
tokenizer="whitespace",
filter=[
"shingle"
],
text="quick brown fox jumps",
)
print(resp) response = client.indices.analyze(
body: {
tokenizer: 'whitespace',
filter: [
'shingle'
],
text: 'quick brown fox jumps'
}
)
puts response const response = await client.indices.analyze({
tokenizer: "whitespace",
filter: ["shingle"],
text: "quick brown fox jumps",
});
console.log(response); GET /_analyze
{
"tokenizer": "whitespace",
"filter": [ "shingle" ],
"text": "quick brown fox jumps"
} Фильтр генерирует следующие токены:
[ quick, quick brown, brown, brown fox, fox, fox jumps, jumps ]
Чтобы сгенерировать шинглы из 2-3 слов, добавьте следующие аргументы в запрос API analyze:
-
min_shingle_size:2 -
max_shingle_size:3
resp = client.indices.analyze(
tokenizer="whitespace",
filter=[
{
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
],
text="quick brown fox jumps",
)
print(resp) response = client.indices.analyze(
body: {
tokenizer: 'whitespace',
filter: [
{
type: 'shingle',
min_shingle_size: 2,
max_shingle_size: 3
}
],
text: 'quick brown fox jumps'
}
)
puts response const response = await client.indices.analyze({
tokenizer: "whitespace",
filter: [
{
type: "shingle",
min_shingle_size: 2,
max_shingle_size: 3,
},
],
text: "quick brown fox jumps",
});
console.log(response); GET /_analyze
{
"tokenizer": "whitespace",
"filter": [
{
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
],
"text": "quick brown fox jumps"
} Фильтр генерирует следующие токены:
[ quick, quick brown, quick brown fox, brown, brown fox, brown fox jumps, fox, fox jumps, jumps ]
Чтобы включить в выходные данные только шинглы, добавьте аргумент output_unigrams со значением false в запрос.
resp = client.indices.analyze(
tokenizer="whitespace",
filter=[
{
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3,
"output_unigrams": False
}
],
text="quick brown fox jumps",
)
print(resp) response = client.indices.analyze(
body: {
tokenizer: 'whitespace',
filter: [
{
type: 'shingle',
min_shingle_size: 2,
max_shingle_size: 3,
output_unigrams: false
}
],
text: 'quick brown fox jumps'
}
)
puts response const response = await client.indices.analyze({
tokenizer: "whitespace",
filter: [
{
type: "shingle",
min_shingle_size: 2,
max_shingle_size: 3,
output_unigrams: false,
},
],
text: "quick brown fox jumps",
});
console.log(response); GET /_analyze
{
"tokenizer": "whitespace",
"filter": [
{
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3,
"output_unigrams": false
}
],
"text": "quick brown fox jumps"
} Фильтр генерирует следующие токены:
[ quick brown, quick brown fox, brown fox, brown fox jumps, fox jumps ]
Добавление в анализатор
Следующий запрос API создания индекса использует фильтр shingle для настройки нового пользовательского анализатора.
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"standard_shingle": {
"tokenizer": "standard",
"filter": [
"shingle"
]
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
standard_shingle: {
tokenizer: 'standard',
filter: [
'shingle'
]
}
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
standard_shingle: {
tokenizer: "standard",
filter: ["shingle"],
},
},
},
},
});
console.log(response); PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"standard_shingle": {
"tokenizer": "standard",
"filter": [ "shingle" ]
}
}
}
}
} Настраиваемые параметры
-
max_shingle_size -
(Необязательно, целое число) Максимальное количество токенов для конкатенации при создании шинглов. По умолчанию
2.Это значение не может быть меньше аргумента
min_shingle_size, который по умолчанию равен2. Разница между этим значением и аргументомmin_shingle_sizeне может превышать уровень настройки индексаindex.max_shingle_diff, который по умолчанию равен3. -
min_shingle_size -
(Необязательно, целое число) Минимальное количество токенов для конкатенации при создании шинглов. По умолчанию
2.Это значение не может превышать аргумент
max_shingle_size, который по умолчанию равен2. Разница между аргументомmax_shingle_sizeи этим значением не может превышать уровень настройки индексаindex.max_shingle_diff, который по умолчанию равен3. -
output_unigrams - (Необязательно, логическое значение) Если
true, выходные данные включают исходные входные токены. Еслиfalse, выходные данные включают только шинглы; исходные входные токены удаляются. По умолчаниюtrue. -
output_unigrams_if_no_shingles -
Если
true, выходные данные включают исходные входные токены только в случае, если шинглы не создаются; если шинглы создаются, выходные данные включают только шинглы. По умолчаниюfalse.Если этот и параметр
output_unigramsоба имеют значениеtrue, используется только аргументoutput_unigrams. -
token_separator - (Необязательно, строка) Разделитель, используемый для конкатенации смежных токенов для формирования шинглов. По умолчанию пробел (
" "). -
filler_token -
(Необязательно, строка) Строка, используемая в шинглах в качестве замены пустых позиций, которые не содержат токенов. Этот заполняющий токен используется только в шинглах, а не в исходных униграммах. По умолчанию символ нижнего подчеркивания (
_).Некоторые фильтры токенов, такие как фильтр
stop, создают пустые позиции при удалении стоп-слов с инкрементом позиции, большим единицы.Пример
В следующей запросе API analyze API, фильтр
stopудаляет стоп-словоaизfox jumps a lazy dog, создавая пустую позицию. Последующий фильтрshingleзаменяет эту пустую позицию знаком плюс (+) в шинглах.resp = client.indices.analyze( tokenizer="whitespace", filter=[ { "type": "stop", "stopwords": [ "a" ] }, { "type": "shingle", "filler_token": "+" } ], text="fox jumps a lazy dog", ) print(resp)response = client.indices.analyze( body: { tokenizer: 'whitespace', filter: [ { type: 'stop', stopwords: [ 'a' ] }, { type: 'shingle', filler_token: '+' } ], text: 'fox jumps a lazy dog' } ) puts responseconst response = await client.indices.analyze({ tokenizer: "whitespace", filter: [ { type: "stop", stopwords: ["a"], }, { type: "shingle", filler_token: "+", }, ], text: "fox jumps a lazy dog", }); console.log(response);GET /_analyze { "tokenizer": "whitespace", "filter": [ { "type": "stop", "stopwords": [ "a" ] }, { "type": "shingle", "filler_token": "+" } ], "text": "fox jumps a lazy dog" }Фильтр генерирует следующие токены:
[ fox, fox jumps, jumps, jumps +, + lazy, lazy, lazy dog, dog ]
Настройка
Для настройки фильтра shingle, дублируйте его, чтобы создать основу для нового пользовательского фильтра токенов. Вы можете изменить фильтр, используя его настраиваемые параметры.
Например, следующий запрос API создания индекса использует пользовательский фильтр токенов shingle, my_shingle_filter, для настройки нового пользовательского анализатора.
Фильтр my_shingle_filter использует значение min_shingle_size равное 2 и значение max_shingle_size равное 5, что означает, что он генерирует шинглы из 2-5 слов. Фильтр также включает аргумент output_unigrams со значением false, что означает, что в выходных данных присутствуют только шинглы.
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"en": {
"tokenizer": "standard",
"filter": [
"my_shingle_filter"
]
}
},
"filter": {
"my_shingle_filter": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 5,
"output_unigrams": False
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
en: {
tokenizer: 'standard',
filter: [
'my_shingle_filter'
]
}
},
filter: {
my_shingle_filter: {
type: 'shingle',
min_shingle_size: 2,
max_shingle_size: 5,
output_unigrams: false
}
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
en: {
tokenizer: "standard",
filter: ["my_shingle_filter"],
},
},
filter: {
my_shingle_filter: {
type: "shingle",
min_shingle_size: 2,
max_shingle_size: 5,
output_unigrams: false,
},
},
},
},
});
console.log(response); PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"en": {
"tokenizer": "standard",
"filter": [ "my_shingle_filter" ]
}
},
"filter": {
"my_shingle_filter": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 5,
"output_unigrams": false
}
}
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/analysis-shingle-tokenfilter.html