Rus va o‘zbek tilida qidiruv uchun Elasticsearch analizatorlari
Amaliyot4 daqInnovialabs tahririyati
Qisqacha
Mahsulot nomini ikki marta indekslang — rus analizatori (stemming, sinonimlar) va kirillni o‘zbek lotiniga o‘giruvchi analizator bilan — so‘ng ikkala maydon bo‘yicha fuzziness bilan qidiring, shunda “non”, “нон” va “nonn” nonni topadi.
Qisqa javob
O‘zbekistonda bitta foydalanuvchi “non” (o‘zbek lotin), “нон” (o‘zbek kirill) yoki “хлеб” (rus tilida) deb yozishi mumkin, ko‘pincha xato bilan. Bitta analizator buning uddasidan chiqmaydi. Ishlaydigan sxema:
- kichik harflarga o‘tkazish, stop-so‘zlar, rus stemmeri va qidiruv paytidagi sinonimlarga ega rus maydoni;
- har qanday kirill o‘zbek lotiniga o‘giriladigan va apostroflar olib tashlanadigan transliteratsiya kichik maydoni;
- ikkala maydon bo‘yicha qidiradigan, transliteratsiya maydonida fuzziness yoqilgan so‘rov.
Har bir qoida prodakshenga chiqishidan oldin _analyze API orqali tekshiriladi.
1-qadam. Analizatorlar va mapping
PUT /products
{
"settings": {
"analysis": {
"char_filter": {
"strip_apostrophes": {
"type": "pattern_replace",
"pattern": "[‘’ʻʼ'`ъьЪЬ]",
"replacement": ""
},
"ru_yo": { "type": "mapping", "mappings": ["ё => е", "Ё => Е"] },
"cyr_to_lat": { "type": "mapping", "mappings_path": "analysis/uz_cyr_lat.txt" }
},
"filter": {
"ru_stop": { "type": "stop", "stopwords": "_russian_" },
"ru_stemmer": { "type": "stemmer", "language": "russian" },
"product_synonyms": {
"type": "synonym_graph",
"synonyms": ["non, нон, хлеб, лепешка", "sharbat, шарбат, сок"]
}
},
"analyzer": {
"ru_index": {
"tokenizer": "standard",
"char_filter": ["ru_yo"],
"filter": ["lowercase", "ru_stop", "ru_stemmer"]
},
"ru_search": {
"tokenizer": "standard",
"char_filter": ["ru_yo"],
"filter": ["lowercase", "product_synonyms", "ru_stop", "ru_stemmer"]
},
"uz_translit": {
"tokenizer": "standard",
"char_filter": ["strip_apostrophes", "cyr_to_lat"],
"filter": ["lowercase", "asciifolding"]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ru_index",
"search_analyzer": "ru_search",
"fields": {
"translit": { "type": "text", "analyzer": "uz_translit" }
}
}
}
}
}
config/analysis/uz_cyr_lat.txt fayli har bir tugunda turadi va har satrda bitta qoidani saqlaydi — kichik va bosh harflar uchun:
ў => o
Ў => O
қ => q
ғ => g
ҳ => h
ш => sh
ч => ch
ё => yo
ю => yu
я => ya
х => x
ц => ts
н => n
о => o
…va hokazo, butun alifbo bo‘yicha. Asosiy qarorlar:
- Avval apostroflar olib tashlanadi, shuning uchun “o‘zbek”, “o‘zbek”, “ozbek” va “ўзбек” hammasi
ozbekbo‘ladi. Foydalanuvchilar to‘g‘ri ‘ belgisini kamdan-kam yozadi. - Sinonimlar faqat qidiruvda.
synonym_graphqidiruv analizatoriga qo‘yiladi va ro‘yxatni o‘zgartirish hujjatlarni qayta indekslashni talab qilmaydi. - Sinonimlar stemmerdan oldin turadi, aks holda “лепешка” allaqachon qisqartirilgan bo‘ladi va qoidaga mos kelmaydi.
2-qadam. Hammasini _analyze bilan tekshiramiz
POST /products/_analyze
{ "field": "name.translit", "text": "Нон Ўзбекча" }
Kutilgan tokenlar: non, ozbekcha. Endi rus qismi:
POST /products/_analyze
{ "analyzer": "ru_search", "text": "лепёшка" }
Siz “лепешка” va “хлеб” so‘zlarining asoslarini hamda non va нон tokenlarini ko‘rishingiz kerak. Biror narsa yetishmasa, muammo filtrlar tartibida yoki ё normalizatsiyasida. Sinonimlar so‘zning aniq shakliga mos kelishini unutmang: kerak bo‘lsa, qoidalarga ko‘plik va boshqa ko‘p uchraydigan shakllarni qo‘shing. Bu chaqiruvlarni kichik testlar to‘plami sifatida saqlang va analizatorlarning har bir o‘zgarishidan keyin ishga tushiring.
3-qadam. Xatolarga chidamli so‘rov
GET /products/_search
{
"query": {
"bool": {
"should": [
{ "match": { "name": { "query": "нонн" } } },
{ "match": { "name.translit": {
"query": "нонн",
"fuzziness": "AUTO",
"prefix_length": 1
} } }
]
}
}
}
fuzziness: AUTOjuda qisqa so‘zlarda tahrirga yo‘l qo‘ymaydi, o‘rtachalarida bitta, uzunlarida ikkita tahrirga ruxsat beradi, shuning uchun “nonn” va “nan” baribir “non”ni topadi.prefix_length: 1birinchi harfni aniq qoldiradi: noto‘g‘ri mosliklar kamroq, so‘rovlar tezroq.- Fuzziness faqat transliteratsiya maydoniga qo‘llanadi. Ko‘p so‘zli sinonimlar bilan birga ishlatilsa, natijalarni oldindan aytish qiyinlashadi.
O‘zbek qo‘shimchalari
Elasticsearch’da tayyor o‘zbek stemmeri yo‘q, o‘zbek tili esa agglyutinativ: “nonlar”, “nonni”, “nonning”. Oddiydan murakkabga qarab variantlar:
- prefiks bo‘yicha qidiruv va avtoto‘ldirish uchun edge_ngram kichik maydoni;
- ko‘p uchraydigan qo‘shimchalarning qisqa ro‘yxatini kesib tashlaydigan pattern_replace filtri — so‘z o‘zaklarini buzmaslik uchun ehtiyotkorlik bilan;
- eng mashhur mahsulot nomlari uchun
stemmer_overrideorqali o‘z lug‘atingiz.
Ko‘p uchraydigan xatolar
- Hamma narsa uchun tayyor
russiananalizatori: lotincha so‘rovlar kirillcha nomlar bilan hech qachon uchrashmaydi. - Mapping faylida bosh harflarni unutish.
- Artikul va shtrix-kodlarda fuzziness — ular uchun
keywordmaydoni va aniq moslik kerak. - Indekslash analizatorlarini qayta indekslashsiz o‘zgartirish: eski hujjatlarda eski tokenlar qoladi.