У меня такая проблема. В наличии товар: Папір офисный Двойной А, А5 (148 х 210 мм), Премиум 80г/м2 500 аркушов
Делаю поисковый запрос: Папір офисный 500 аркушів< /code> - все нормально, найден.
Но когда я делаю запрос: Папір офісний на 500 аркушів - товар не найден.
В чем может быть проблема? Пытаюсь добавить его в стоп-слова, но результата нет.
Мне нужны такие слова как: "on", "in", "and".. . Никак не повлияло на поисковый запрос. Они обычно игнорировались в поисковом запросе.
Изображение: elasticsearch:7.9.1
Вот код для создания индекса:
public function createIndex()
{
$mappingParams = [
'index' => $this->getIndexName(),
'body' => [
'mappings' => [
'_source' => [
'enabled' => true
],
'properties' => $this->getMappingProperties(),
],
'settings' => [
'analysis' => [
'normalizer' => [
'lowercase_keyword' => [
'type' => 'custom',
'filter' => ['lowercase', 'trim'],
],
],
'tokenizer' => [
'ngram_tokenizer' => [
'type' => 'edge_ngram',
'min_gram' => 1,
'max_gram' => 15,
'token_chars' => [
'letter',
'digit',
],
],
],
'filter' => [
'synonym_filter' => [
'type' => 'synonym',
'synonyms' => [
'аркуш, сторінка', 'арк, ст', 'аркуш, ст', 'сторінка, арк', 'автомобіль, машина',
'тетрадь, зошит', 'кошелек, гаманець', 'на' => ' ',
],
],
'uk_stopwords' => [
'type' => 'stop',
'stopwords' => ['на', 'та', 'і', 'at', 'TY358'],
],
],
'analyzer' => [
'ngram_analyzer' => [
'type' => 'custom',
'tokenizer' => 'ngram_tokenizer',
'filter' => [
'lowercase',
'trim',
'synonym_filter',
'uk_stopwords',
'stop',
],
],
],
],
'index' => [
'max_result_window' => intval(\Variable::getArray('settings.elasticsearch.index_size', 100000)),
],
],
],
];
return $this->getClient()?->indices()->create($mappingParams);
}
Вот сопоставление индекса:
protected array $mappingProperties = [
'id' => [
'type' => 'keyword',
],
'name' => [
'type' => 'text',
'fielddata' => true,
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'standard',
'fields' => [
'keyword' => [
'type' => 'keyword',
'normalizer' => 'lowercase_keyword',
]
],
],
'name_ru' => [
'type' => 'text',
'fielddata' => true,
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'standard',
'fields' => [
'keyword' => [
'type' => 'keyword',
'normalizer' => 'lowercase_keyword',
]
],
],
'body' => [
'type' => 'text',
],
'body_ru' => [
'type' => 'text',
],
'price' => [
'type' => 'object',
],
'extern_id' => [
'type' => 'keyword',
'fields' => [
'long' => [
'type' => 'long',
]
],
],
'gtin' => [
'type' => 'keyword',
],
'artikul' => [
'type' => 'text',
'fielddata' => true,
'fields' => [
'keyword' => [
'type' => 'keyword',
'normalizer' => 'lowercase_keyword',
]
],
],
'gpc' => [
'type' => 'integer',
],
'rating' => [
'type' => 'float',
],
'status' => [
'type' => 'keyword',
],
'availability' => [
'type' => 'integer',
],
'created_at' => [
'type' => 'date',
],
'category_id' => [
'type' => 'keyword',
],
'categories_ids' => [
'type' => 'keyword',
],
'brand_id' => [
'type' => 'keyword',
],
'properties' => [
'type' => 'object',
],
'is_feed' => [
'type' => 'boolean',
],
'is_prior' => [
'type' => 'boolean',
],
'is_new' => [
'type' => 'boolean',
],
'is_action' => [
'type' => 'boolean',
],
'is_popular' => [
'type' => 'boolean',
],
'is_showonmain' => [
'type' => 'boolean',
],
'is_freedelivery' => [
'type' => 'boolean',
],
'has_in_gurt' => [
'type' => 'boolean',
],
'has_in_fop' => [
'type' => 'boolean',
],
];
Вот как поисковый запрос строится по имени (текстовое поле):
$scoreSort = false;
$query = [];
if ($value = Arr::get($params, 'q')) {
$termQuery = [
'query' => [
'term' => [
'extern_id' => [
'value' => $value
]
]
]
];
$termResponse = $this->searchOnElasticsearch($termQuery);
$scoreSort = true;
if ($termResponse['hits']['total']['value'] > 0) {
$query['query']['bool']['must'][] = [
'term' => [
'extern_id' => substr($value, 0, 100)
]
];
} else {
if (($locale = app()->getLocale()) === 'uk') {
$nameField = 'name';
$fields = ['extern_id^15', 'gtin^10', 'artikul^10', "{$nameField}^5"];
} else {
$nameField = "name_{$locale}";
$fields = ['extern_id^15', 'gtin^10', 'artikul^10', "{$nameField}^5"];
}
$query['query']['bool']['must'][] = [
'bool' => [
'should' => [
[
'term' => [
"{$nameField}.keyword" => $value
]
],
[
'multi_match' => [
'fields' => $fields,
'query' => substr($value, 0, 100),
'fuzziness' => $this->getFuzziness(substr($value, 0, 100)),
'prefix_length' => 3,
'operator' => 'AND',
'analyzer' => 'ngram_analyzer',
],
]
]
]
];
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... sticsearch
Стоп-слова не работают на украинском языке [Elasticsearch] ⇐ Php
Кемеровские программисты php общаются здесь
-
Anonymous
1726949768
Anonymous
У меня такая проблема. В наличии товар: Папір офисный Двойной А, А5 (148 х 210 мм), Премиум 80г/м2 500 аркушов
Делаю поисковый запрос: Папір офисный 500 аркушів< /code> - все нормально, найден.
Но когда я делаю запрос: Папір офісний на 500 аркушів - товар не найден.
В чем может быть проблема? Пытаюсь добавить его в стоп-слова, но результата нет.
Мне нужны такие слова как: "on", "in", "and".. . Никак не повлияло на поисковый запрос. Они обычно игнорировались в поисковом запросе.
Изображение: [b]elasticsearch:7.9.1[/b]
Вот код для создания индекса:
public function createIndex()
{
$mappingParams = [
'index' => $this->getIndexName(),
'body' => [
'mappings' => [
'_source' => [
'enabled' => true
],
'properties' => $this->getMappingProperties(),
],
'settings' => [
'analysis' => [
'normalizer' => [
'lowercase_keyword' => [
'type' => 'custom',
'filter' => ['lowercase', 'trim'],
],
],
'tokenizer' => [
'ngram_tokenizer' => [
'type' => 'edge_ngram',
'min_gram' => 1,
'max_gram' => 15,
'token_chars' => [
'letter',
'digit',
],
],
],
'filter' => [
'synonym_filter' => [
'type' => 'synonym',
'synonyms' => [
'аркуш, сторінка', 'арк, ст', 'аркуш, ст', 'сторінка, арк', 'автомобіль, машина',
'тетрадь, зошит', 'кошелек, гаманець', 'на' => ' ',
],
],
'uk_stopwords' => [
'type' => 'stop',
'stopwords' => ['на', 'та', 'і', 'at', 'TY358'],
],
],
'analyzer' => [
'ngram_analyzer' => [
'type' => 'custom',
'tokenizer' => 'ngram_tokenizer',
'filter' => [
'lowercase',
'trim',
'synonym_filter',
'uk_stopwords',
'stop',
],
],
],
],
'index' => [
'max_result_window' => intval(\Variable::getArray('settings.elasticsearch.index_size', 100000)),
],
],
],
];
return $this->getClient()?->indices()->create($mappingParams);
}
Вот [b]сопоставление[/b] индекса:
protected array $mappingProperties = [
'id' => [
'type' => 'keyword',
],
'name' => [
'type' => 'text',
'fielddata' => true,
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'standard',
'fields' => [
'keyword' => [
'type' => 'keyword',
'normalizer' => 'lowercase_keyword',
]
],
],
'name_ru' => [
'type' => 'text',
'fielddata' => true,
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'standard',
'fields' => [
'keyword' => [
'type' => 'keyword',
'normalizer' => 'lowercase_keyword',
]
],
],
'body' => [
'type' => 'text',
],
'body_ru' => [
'type' => 'text',
],
'price' => [
'type' => 'object',
],
'extern_id' => [
'type' => 'keyword',
'fields' => [
'long' => [
'type' => 'long',
]
],
],
'gtin' => [
'type' => 'keyword',
],
'artikul' => [
'type' => 'text',
'fielddata' => true,
'fields' => [
'keyword' => [
'type' => 'keyword',
'normalizer' => 'lowercase_keyword',
]
],
],
'gpc' => [
'type' => 'integer',
],
'rating' => [
'type' => 'float',
],
'status' => [
'type' => 'keyword',
],
'availability' => [
'type' => 'integer',
],
'created_at' => [
'type' => 'date',
],
'category_id' => [
'type' => 'keyword',
],
'categories_ids' => [
'type' => 'keyword',
],
'brand_id' => [
'type' => 'keyword',
],
'properties' => [
'type' => 'object',
],
'is_feed' => [
'type' => 'boolean',
],
'is_prior' => [
'type' => 'boolean',
],
'is_new' => [
'type' => 'boolean',
],
'is_action' => [
'type' => 'boolean',
],
'is_popular' => [
'type' => 'boolean',
],
'is_showonmain' => [
'type' => 'boolean',
],
'is_freedelivery' => [
'type' => 'boolean',
],
'has_in_gurt' => [
'type' => 'boolean',
],
'has_in_fop' => [
'type' => 'boolean',
],
];
Вот как [b]поисковый запрос[/b] строится по имени (текстовое поле):
$scoreSort = false;
$query = [];
if ($value = Arr::get($params, 'q')) {
$termQuery = [
'query' => [
'term' => [
'extern_id' => [
'value' => $value
]
]
]
];
$termResponse = $this->searchOnElasticsearch($termQuery);
$scoreSort = true;
if ($termResponse['hits']['total']['value'] > 0) {
$query['query']['bool']['must'][] = [
'term' => [
'extern_id' => substr($value, 0, 100)
]
];
} else {
if (($locale = app()->getLocale()) === 'uk') {
$nameField = 'name';
$fields = ['extern_id^15', 'gtin^10', 'artikul^10', "{$nameField}^5"];
} else {
$nameField = "name_{$locale}";
$fields = ['extern_id^15', 'gtin^10', 'artikul^10', "{$nameField}^5"];
}
$query['query']['bool']['must'][] = [
'bool' => [
'should' => [
[
'term' => [
"{$nameField}.keyword" => $value
]
],
[
'multi_match' => [
'fields' => $fields,
'query' => substr($value, 0, 100),
'fuzziness' => $this->getFuzziness(substr($value, 0, 100)),
'prefix_length' => 3,
'operator' => 'AND',
'analyzer' => 'ngram_analyzer',
],
]
]
]
];
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79006984/stopwords-do-not-work-in-ukrainian-elasticsearch[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия