Asosiy kontentga o‘tish
Innovialabs

Rus va o‘zbek tilida qidiruv uchun Elasticsearch analizatorlari

Amaliyot4 daq

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 ozbek bo‘ladi. Foydalanuvchilar to‘g‘ri ‘ belgisini kamdan-kam yozadi.
  • Sinonimlar faqat qidiruvda. synonym_graph qidiruv 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: AUTO juda 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: 1 birinchi 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_override orqali o‘z lug‘atingiz.

Ko‘p uchraydigan xatolar

  • Hamma narsa uchun tayyor russian analizatori: lotincha so‘rovlar kirillcha nomlar bilan hech qachon uchrashmaydi.
  • Mapping faylida bosh harflarni unutish.
  • Artikul va shtrix-kodlarda fuzziness — ular uchun keyword maydoni va aniq moslik kerak.
  • Indekslash analizatorlarini qayta indekslashsiz o‘zgartirish: eski hujjatlarda eski tokenlar qoladi.

Ko‘p beriladigan savollar

Shart emas. O‘z jadvalingizga ega mapping turidagi char filter to‘liq oldindan aytib bo‘ladigan natija beradi va o‘zbek qoidalariga amal qiladi (х — x, ш — sh bo‘ladi). ICU o‘zgartirishlari bir vaqtda ko‘p tillar uchun qulay, lekin ularning natijasi har doim ham o‘zbek imlosiga mos kelmaydi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.