04 рдЕрдЧре░ 2025┬╖8 рдорд┐рдирдЯ рдкрдврд╝рдиреЗ рдореЗрдВ

PostgreSQL рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬ: рдкреВрд░реНрдг-рдкрд╛рда, рдЯреНрд░рд┐рдЧреНрд░рд╛рдо, рдЖрдВрд╢рд┐рдХ рдЗрдВрдбреЗрдХреНрд╕

рдЖрдВрддрд░рд┐рдХ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ "рд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬ" рдХреИрд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░реЗрдВ тАФ PostgreSQL рдореЗрдВ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ, рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдЖрдВрд╢рд┐рдХ рдЗрдВрдбреЗрдХреНрд╕ рдХрдм рдФрд░ рдХреИрд╕реЗ рдЪреБрдиреЗрдВ, рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдлрд╝рд╛рд╕реНрдЯ рдФрд░ рдкреНрд░реЗрдбрд┐рдХреНрдЯреЗрдмрд▓ рд╣реЛрдВред

PostgreSQL рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬ: рдкреВрд░реНрдг-рдкрд╛рда, рдЯреНрд░рд┐рдЧреНрд░рд╛рдо, рдЖрдВрд╢рд┐рдХ рдЗрдВрдбреЗрдХреНрд╕

рдЖрдВрддрд░рд┐рдХ рдЯреВрд▓реНрд╕ рдореЗрдВ тАЬрд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬтАЭ рдХрд╛ рдЕрд╕рд▓реА рдорддрд▓рдм

рдПрдХ internal рд╕реНрдХреНрд░реАрди рдкрд░, тАЬрд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬтАЭ рдЖрдорддреМрд░ рдкрд░ рдорддрд▓рдм рд╣реЛрддрд╛ рд╣реИ: тАЬрдореБрдЭреЗ рд╡рд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд░рд┐рдХреЙрд░реНрдб рдЬрд▓реНрджреА рд╕реЗ рджрд┐рдЦрд╛рдУ рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ, рднрд▓реЗ рд╣реА рдореБрдЭреЗ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рдпрд╛рдж рди рд╣реЛредтАЭ рд▓реЛрдЧ рдмреНрд░рд╛рдЙрдЬрд╝ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗред рд╡реЗ рд╕реАрдзреЗ рдХрд┐рд╕реА рдЧреНрд░рд╛рд╣рдХ, рдЯрд┐рдХрдЯ, рдЪрд╛рд▓рд╛рди, рдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЗрд╕реАрд▓рд┐рдП рдзреАрдореА рдЦреЛрдЬ рдзреАрдореЗ рдкреЗрдЬ рд╕реЗ рднреА рдЬреНрдпрд╛рджрд╛ рдмреБрд░рд╛ рдЕрдиреБрднрд╡ рджреЗрддреА рд╣реИред рдПрдХ рдкреЗрдЬ рд▓реЛрдб рдПрдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЦреЛрдЬ рдмрд╛рд░-рдмрд╛рд░ рд╣реЛрддреА рд╣реИ, рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рдХреЙрд▓ рдпрд╛ рдЯреНрд░рд╛рдпрдЬ рдХреЗ рджреМрд░рд╛рдиред рдЕрдЧрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ 2тАУ3 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд╡реЗрд░реА рдмрджрд▓рддреЗ рд╣реИрдВ, рдмреИрдХрд╕реНрдкреЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░рд╛ рд╢рдмреНрдж рдЖрдЬрдорд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдзрд┐рдХ рд▓реЛрдб рдФрд░ рдирд┐рд░рд╛рд╢рд╛ рдмрдврд╝рддреА рд╣реИред

рдПрдХ рд╕рд┐рдВрдЧрд▓ рд╕рд░реНрдЪ рдмреЙрдХреНрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдИ рдЙрдореНрдореАрджреЗрдВ рд░рдЦрддреЗ рд╣реИрдВ: рдЖрдВрд╢рд┐рдХ рдореИрдЪ ("alex" рд╕реЗ "Alexander" рдорд┐рд▓рддрд╛ рд╣реИ), рдЫреЛрдЯреЗ рдЯрд╛рдЗрдкреЛ рдХреЗ рд▓рд┐рдП рд╕рд╣рдирд╢реАрд▓рддрд╛ ("microsfot" рд╕реЗ рднреА "Microsoft" рдорд┐рд▓реЗ), рд╕рдордЭрджрд╛рд░реА рд╕реЗ тАЬbest resultтАЭ ordering (exact IDs рдпрд╛ emails рдКрдкрд░ рд░рд╣реЗрдВ), рдереЛрдбрд╝реА recency bias, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдлрд╝рд┐рд▓реНрдЯрд░ (open tickets, active customers)ред

рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЗрдирдкреБрдЯ рдХрдИ рдЗрд░рд╛рджреЛрдВ рдХреЛ рдЫреБрдкрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдПрдЬреЗрдВрдЯ рдЯрд┐рдХрдЯ рдирдВрдмрд░ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдирд╛рдо рдХрд╛ рдЕрдВрд╢ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдИрдореЗрд▓ рдЦреЛрдЬ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдлреЛрди рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд░ рдЗрд░рд╛рджрд╛ рдЕрд▓рдЧ рд░рдгрдиреАрддрд┐, рдЕрд▓рдЧ рдЗрдВрдбреЗрдХреНрд╕, рдФрд░ рдХрднреА-рдХрднреА рдЕрд▓рдЧ ranking рдирд┐рдпрдо рдЪрд╛рд╣рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рд╢реБрд░реВ рдордд рдХрд░реЗрдВред рдкрд╣рд▓реЗ рдЙрди рдХреБрдЫ search intents рдХреА рд╕реВрдЪреА рдмрдирд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ identity fields (IDs, emails) рдХреЛ fuzzy fields (names, subjects) рдФрд░ рд▓рдВрдмреА рдЯреЗрдХреНрд╕реНрдЯ (notes) рд╕реЗ рдЕрд▓рдЧ рд░рдЦреЗрдВред

рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдФрд░ рд╕рд░реНрдЪ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░реЗрдВ

рдЗрдВрдбреЗрдХреНрд╕ рдЪреБрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦ рд▓реЗрдВ рдХрд┐ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред тАЬPostgreSQL search everywhereтАЭ рдПрдХ рдлреАрдЪрд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдкрд░ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░рд╣ рдХреА рдЦреЛрдЬреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реЛрддрд╛ рд╣реИред

рдЖрдВрддрд░рд┐рдХ рдЯреВрд▓ тАЬрд╣рд╛рд░реНрдбтАЭ identifiers (order ID, ticket number, invoice code) рдХреЛ тАЬрд╕реЙрдлреНрдЯтАЭ рдЯреЗрдХреНрд╕реНрдЯ (customer name, email, notes, tags) рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред рдпреЗ рд╕рдореВрд╣ PostgreSQL рдореЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ рдПрдХ рдЬреИрд╕рд╛ рдорд╛рдирдирд╛ рддреЗрдЬ рдХреНрд╡реЗрд░реАрдЬ рдкрд╛рдиреЗ рдХрд╛ рддреЗрдЬрд╝ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред

рдлрд┐рд░ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ:

  • Exact lookup: рдХреЛрдИ TCK-104883 рдЬреИрд╕реЗ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред
  • Fuzzy lookup: рдХреЛрдИ john smth рдЯрд╛рдЗрдк рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирд╛рдореЛрдВ (рдФрд░ рд╢рд╛рдпрдж рдИрдореЗрд▓) рдкрд░ рдПрдХ рд╕рд╣рдирд╢реАрд▓ рдореИрдЪ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЫреЛрдЯреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдЧрд╛ред
  • Filter-driven search: рдХреЛрдИ тАЬStatus = OpenтАЭ рдФрд░ тАЬAssigned to = MeтАЭ рдЪреБрди рд░рд╣рд╛ рд╣реИ; рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рдкреНрд░рд╛рдердорд┐рдХ рдирд╣реАрдВ рд╣реИред

рд╢реБрд░реВ рдореЗрдВ рддрдп рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд░реИрдВрдХ рдХрд░рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ (best matches рдкрд╣рд▓реЗ) рдпрд╛ рдмрд╕ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд░реИрдВрдХрд┐рдВрдЧ notes рдФрд░ рд▓рдВрдмреА descriptions рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред IDs рдФрд░ emails рдХреЗ рд▓рд┐рдП рд░реИрдВрдХрд┐рдВрдЧ рдЕрдХреНрд╕рд░ рдмреЗрддрд░рддреАрдм рд▓рдЧрддреА рд╣реИ рдФрд░ рд▓рд╛рдЧрдд рдмрдврд╝рд╛рддреА рд╣реИред

рдПрдХ рдЫреЛрдЯрд╛ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХрд╛рдлреА рд╣реЛрддрд╛ рд╣реИ:

  • рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд░реЛрдЬрд╝ Search рд╣реЛрддреЗ рд╣реИрдВ?
  • рдХреМрди рд╕реЗ рдЗрдирдкреБрдЯ exact (IDs, codes), fuzzy (names), рдпрд╛ long text (notes) рд╣реИрдВ?
  • рдХреМрди рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рдЧрднрдЧ рд╣рд░ рдЦреЛрдЬ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ?
  • рдХреНрдпрд╛ рдЖрдкрдХреЛ тАЬbest matchтАЭ ordering рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреЛрдИ рднреА рдореИрдЪ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ?
  • рдЯреЗрдмрд▓ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдмрдврд╝реЗрдЧреА: рд╣рдЬрд╛рд░реЛрдВ, рд▓рд╛рдЦреЛрдВ рдпрд╛ рдХрд░реЛрдбрд╝реЛрдВ?

рдЕрдЧрд░ рдЖрдк рдпреЗ рдирд┐рд░реНрдгрдп рдкрд╣рд▓реЗ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдж рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдЪреБрдирдирд╛ рдЕрдВрджрд╛рдЬрд╝ рдирд╣реАрдВ рд░рд╣реЗрдЧрд╛ред

рдмреЗрд╕рд▓рд╛рдЗрди: exact matches рдФрд░ рдХреНрдпреЛрдВ ILIKE рдЕрдХреНрд╕рд░ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдБрдЪрд╛рддрд╛ рд╣реИ

рдкрд╣рд▓реЗ рдЖрд╕рд╛рди рдЬреАрддреЗрдВ рд▓реЙрдХ рдХрд░ рд▓реЗрдВред рдХрдИ internal рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП plain B-tree рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ exact matches рдЬреИрд╕реЗ IDs, order numbers, emails, рдФрд░ external references рдкрд░ рддрддреНрдХрд╛рд▓ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓ рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдЧрд░ рд▓реЛрдЧ exact value рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ exact рд╣реИред WHERE id = ... рдпрд╛ WHERE email = ... рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмреЗрд╣рдж рддреЗрдЬрд╝ рд╣реЛ рд╕рдХрддреА рд╣реИред email рдкрд░ unique index рдЕрдХреНрд╕рд░ рджреЛрд╣рд░реЗ рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИ: рдЧрддрд┐ рдФрд░ рдмреЗрд╣рддрд░ рдбреЗрдЯрд╛ рдЧреБрдгрд╡рддреНрддрд╛ред

рджрд┐рдХреНрдХрдд рддрдм рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдЬрдм тАЬsearch everywhereтАЭ рдЪреБрдкрдХреЗ рд╕реЗ ILIKE рдмрди рдЬрд╛рддрд╛ рд╣реИред name ILIKE '%ann%' рдЬреИрд╕реА рдХреНрд╡реЗрд░реА рдореЗрдВ leading wildcard рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП PostgreSQL рд╕рд╛рдорд╛рдиреНрдп B-tree рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рддрд╛ред рд╡рд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЯреЗрдмрд▓ рдмрдврд╝рдиреЗ рдкрд░ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдзреАрдорд╛ рд╣реЛрддрд╛ рдЬрд╛рддрд╛ рд╣реИред

Prefix search рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ, рдкрд░ рдХреЗрд╡рд▓ рддрдм рдЬрдм рдкреИрдЯрд░реНрди рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдВрдХрд░ рд╣реЛ: name ILIKE 'ann%'. рддрдм рднреА рдбрд┐рдЯреЗрд▓реНрд╕ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИрдВ (collation, case handling, рдФрд░ рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡рд╣реА expression рдЗрдВрдбреЗрдХреНрд╕ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХреНрд╡реЗрд░реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдЕрдЧрд░ рдЖрдкрдХреЗ UI рдХреЛ case-insensitive рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ lower(name) рдкрд░ рдХреНрд╡реЗрд░реА рдХрд░рдирд╛ рдФрд░ рдЙрд╕реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдирд╛ред

рдпрд╣ рддрдп рдХрд░рдирд╛ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ тАЬsnappyтАЭ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ:

  • рд╡реЙрд░реНрдо рдХреИрд╢ рдкрд░ database рдХрд╛рдо рдХреЗ рд▓рд┐рдП ~200 ms рдпрд╛ рдХрдо
  • рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рд╣рд┐рдд 1 рд╕реЗрдХрдВрдб рд╕реЗ рдХрдо end-to-end
  • рд╕рд╛рдорд╛рдиреНрдп рдЦреЛрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ loading state рди рджрд┐рдЦреЗ

рдРрд╕реЗ рд▓рдХреНрд╖реНрдп рд╣реЛрдиреЗ рд╕реЗ рдпрд╣ рддрдп рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк exact рдФрд░ prefix рдкрд░ рдЯрд┐рдХреЗрдВ рдпрд╛ full-text рдпрд╛ trigram рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред

рдХрдм full-text search рд╕рд╣реА рдЯреВрд▓ рд╣реИ

Full-text search рддрдм рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрдм рд▓реЛрдЧ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд╕рд╣реА рдЖрдЗрдЯрдо рдвреВрдВрдвреЗ, рдирд╛ рдХрд┐ рдХреЗрд╡рд▓ exact рдореИрдЪред рд╕реЛрдЪрд┐рдП рдЯрд┐рдХрдЯ рд╕рдВрджреЗрд╢, internal рдиреЛрдЯреНрд╕, рд▓рдВрдмреА descriptions, knowledge base рд▓реЗрдЦ, рдФрд░ рдХреЙрд▓ рд▓реЙрдЧреНрд╕ред

рдмрдбрд╝реА рдЬреАрдд рд╣реИ rankingред рд▓рдВрдмреА рд╕реВрдЪреА рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬрд╣рд╛рдБ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкрд░рд┐рдгрд╛рдо рджрдмреЗ рд╣реЛрддреЗ рд╣реИрдВ, full-text search relevance рдХреЗ рдЖрдзрд╛рд░ рдкрд░ sort рдХрд░ рд╕рдХрддрд╛ рд╣реИред internal рдЯреВрд▓реНрд╕ рдореЗрдВ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ: рдХрд┐рд╕реА рдХреЛ рд╕реЗрдХрдВрдбреЛрдВ рдореЗрдВ рдЙрддреНрддрд░ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ 50 rows рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред

рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░, full-text search рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:

  • рдПрдХ tsvector (searchable text, stored рдпрд╛ generated)
  • рдПрдХ tsquery (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ, рдХреНрд╡реЗрд░реА рдореЗрдВ рдмрджрд▓рдХрд░)
  • рдПрдХ language configuration (рд╢рдмреНрджреЛрдВ рдХреЛ normalize рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП)

Language configuration рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИред PostgreSQL рд╕рд╛рдорд╛рдиреНрдп stop words (рдЬреИрд╕реЗ тАЬtheтАЭ рдпрд╛ тАЬandтАЭ) рд╣рдЯрд╛рддрд╛ рд╣реИ рдФрд░ stemming рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ тАЬpayтАЭ, тАЬpaidтАЭ, рдФрд░ тАЬpaymentтАЭ рдореЗрд▓ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдиреЛрдЯреНрд╕ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдкрд░ рдЬрдм рдХреЛрдИ рдЫреЛрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рдЦреЛрдЬрддрд╛ рд╣реИ рддреЛ рдХрднреА-рдХрднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

Synonyms рднреА рдирд┐рд░реНрдгрдп рдХрд╛ рдкреЙрдЗрдВрдЯ рд╣реИрдВред рдЬрдм рдЖрдкрдХреА рдХрдВрдкрдиреА рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╢рдмреНрдж рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, тАЬrefundтАЭ рдмрдирд╛рдо тАЬchargebackтАЭ), рддрдм рд╡реЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред synonym рд╕реВрдЪреА рдЫреЛрдЯреА рд░рдЦреЗрдВ рдФрд░ рдЙрд╕реЗ рд╕рдорд░реНрдерди/рдСрдкреНрд╕ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд░рдЦреЗрдВред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг: тАЬcanтАЩt login after resetтАЭ рдЦреЛрдЬрдиреЗ рдкрд░ рдЙрд╕реЗ рдРрд╕реЗ рдЯрд┐рдХрдЯреНрд╕ рджрд┐рдЦрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдореЗрдВ рд╕рдВрджреЗрд╢ рдХрд╣рддрд╛ рд╣реИ тАЬcannot log in after password resetтАЭ рднрд▓реЗ рд╣реА рд╢рдмреНрдж рдЕрд▓рдЧ рд╣реЛрдВред рдпрд╣реА тАЬrelevant рдвреВрдБрдврдирд╛тАЭ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП full-text search рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдХреНрд╕рд░ ILIKE рдХреЛ search engine рдЬреИрд╕рд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред

рдХрдм рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕ рдмреЗрд╣рддрд░ рд╣реИрдВ

рдЕрдкрдирд╛ Data Model рд╕рд╣реА рдмрдирд╛рдПрдВ
рдкрд╣рд▓реЗ рд╣реА identity fields рдФрд░ fuzzy fields рдХреЛ рдореИрдк рдХрд░реЗрдВ рддрд╛рдХрд┐ рдбреЗрдЯрд╛ рдмрдврд╝рдиреЗ рдкрд░ рдЖрдкрдХреА рдРрдк рддреЗрдЬрд╝ рд░рд╣реЗред
рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмрдирд╛рдпреЗрдВ

Trigram рдЗрдВрдбреЗрдХреНрд╕ рддрдм рдордЬрдмреВрдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ fragments рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдкреЛ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдХреЗрд╡рд▓ тАЬрдХреБрдЫ рдЬреИрд╕рд╛тАЭ рдпрд╛рдж рд░рдЦрддреЗ рд╣реИрдВред рдпреЗ рдЫреЛрдЯреЗ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдбреНрд╕ рдкрд░ рдЪрдордХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ full-text рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИ: person names, company names, ticket subjects, SKUs, order numbers, рдФрд░ product codesред

рдПрдХ trigram 3-рдЕрдХреНрд╖рд░ рдХрд╛ chunk рд╣реЛрддрд╛ рд╣реИред PostgreSQL рджреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рддреБрд▓рдирд╛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рддрдиреЗ trigrams рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИрдВред рдЗрд╕реАрд▓рд┐рдП рдпрд╣ "Jon Smth" рдХреЛ "John Smith" рд╕реЗ рдФрд░ "ACM" рдХреЛ "ACME" рд╕реЗ рдореИрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рддрдм рднреА рдкрд░рд┐рдгрд╛рдо рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХреНрд╡реЗрд░реА рд╢рдмреНрдж рдХреЗ рдмреАрдЪ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛред

рдпрд╣ рдЕрдХреНрд╕рд░ рдЙрд╕ рддрд░рд╣ рдХреЗ тАЬрдорд╛рдирд╡ рдХреЗ рдЕрдиреБрдХреВрд▓тАЭ рд╕рд░реНрдЪ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд░рд╛рд╕реНрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХрд╛рдо рд╣реИ тАЬрдореБрдЭреЗ рд╕рд╣реА row рдвреВрдБрдвреЛ,тАЭ рди рдХрд┐ тАЬрдХрд┐рд╕реА рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдвреВрдБрдвреЛредтАЭ

рдЬрд╣рд╛рдБ рдпрд╣ full-text рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ

Full-text рд▓рдВрдмреА рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдЕрд░реНрде рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реИрдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╢рд╛рдирджрд╛рд░ рд╣реИ, рдкрд░ рдпрд╣ рдЫреЛрдЯ█Т рдлрд╝реАрд▓реНрдбреНрд╕ рдкрд░ рдЖрдВрд╢рд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдЫреЛрдЯреЗ рдЯрд╛рдЗрдкреЛ рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рдирд╣реАрдВред Trigram рдЦреЛрдЬ рдЙрд╕ рддрд░рд╣ рдХреА fuzziness рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд╣реИред

write рд▓рд╛рдЧрдд рдХреЛ рд╡рд╛рдЬрд┐рдм рд░рдЦреЗрдВ

Trigram рдЗрдВрдбреЗрдХреНрд╕ рдмрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ writes рдкрд░ рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЪреБрдирд┐рдВрджрд╛ рдмрдиреЗрдВред рдЙрди рдХреЙрд▓рдореНрд╕ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░реЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ:

  • Name, email, company, username
  • Short identifiers (SKU, code, reference)
  • рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд title рдлрд╝реАрд▓реНрдб (рди рдХрд┐ рдмрдбрд╝рд╛ notes/comments рдлрд╝реАрд▓реНрдб)

рдпрджрд┐ рдЖрдк рдирд╛рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреАрдо search рдмреЙрдХреНрд╕ рдореЗрдВ рдХрд┐рди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдо рддреМрд░ рдкрд░ рдЖрдк рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рддреЗрдЬрд╝ рд░рдЦ рдкрд╛рдПрдБрдЧреЗред

рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЙрдирдХреЗ рд▓рд┐рдП Partial indexes

рдЕрдкрдирд╛ Stack Own рдХрд░реЗрдВ
Self-hosting рдФрд░ рдЧрд╣рд░реА рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП source export рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ control рд░рдЦреЗрдВред
рд╕реНрд░реЛрдд рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ

рдПрдХ тАЬsearch everywhereтАЭ рдмреЙрдХреНрд╕ рдЕрдХреНрд╕рд░ рдЫрд┐рдкреЗ рд╣реБрдП рдбрд┐рдлрд╝реЙрд▓реНрдЯреНрд╕ рд░рдЦрддрд╛ рд╣реИред рд▓реЛрдЧ рдХрд┐рд╕реА workspace рдХреЗ рдЕрдВрджрд░ рдЦреЛрдЬрддреЗ рд╣реИрдВ, active items рдкрд░, рдФрд░ deleted рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдпреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рдЧрднрдЧ рд╣рд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдо рдХреЗрд╕ рдХреЛ рддреЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЙрди rows рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░реЗрдВ рдЬреЛ рдЙрди рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред

Partial index рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдбреЗрдХреНрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ WHERE рдХреНрд▓реЙрдЬрд╝ рд╣реЛрддрд╛ рд╣реИред PostgreSQL рдЗрд╕реЗ рдЫреЛрдЯрд╛ рд░рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЙрди rows рдХреЗ entries рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╝рд░реВрд░рдд рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЕрдХреНрд╕рд░ рдХрдо рдкреЗрдЬ рдкрдврд╝рдирд╛ рдФрд░ рдмреЗрд╣рддрд░ cache hit rates рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп partial-index рд▓рдХреНрд╖реНрдп рд╣реИрдВ active rows (status = 'active'), soft deletes (deleted_at IS NULL), tenant scoping, рдФрд░ тАЬrecentтАЭ рд╡рд┐рдВрдбреЛ (рдЙрджрд╛. рдкрд┐рдЫрд▓реЗ 90 рджрд┐рди)ред

рдХреБрдВрдЬреА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ UI рд╕реЗ рдореЗрд▓ рдЦрд╛рдПред рдЕрдЧрд░ рд╕реНрдХреНрд░реАрди рд╣рдореЗрд╢рд╛ deleted rows рдЫреБрдкрд╛рддреА рд╣реИ, рддреЛ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ рд╣рдореЗрд╢рд╛ deleted_at IS NULL рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрдкрдХреЗ partial index рдХреЛ рд╡рд╣реА condition рдЙрдкрдпреЛрдЧ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЫреЛрдЯреЗ mismatchesтАФрдЬреИрд╕реЗ рдПрдХ рдЬрдЧрд╣ is_deleted = false рдФрд░ рджреВрд╕рд░реА рдЬрдЧрд╣ deleted_at IS NULLтАФplanner рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИрдВред

Partial indexes full-text рдФрд░ trigram рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, non-deleted rows рдХреЗ рд▓рд┐рдП text search рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдирд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

рдЯреНрд░реЗрдб-рдСрдл: partial indexes рджреБрд░реНрд▓рдн рдХреНрд╡реЗрд░реАрдЬ рдХреЗ рд▓рд┐рдП рдХрдо рдорджрджрдЧрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдХреЛрдИ рдХрднреА-рдХрднреА deleted records рдкрд░ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд╕рднреА workspaces рдореЗрдВ рдЦреЛрдЬрддрд╛ рд╣реИ, рддреЛ PostgreSQL рдзреАрдореЗ рдкреНрд▓рд╛рди рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ admin-only path рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░реЗрдВ, рдпрд╛ рдХреЗрд╡рд▓ рддрднреА рджреВрд╕рд░рд╛ рдЗрдВрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ рдЬрдм рджреБрд░реНрд▓рдн рдХреНрд╡реЗрд░реА рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдПред

рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реБрдП рдмрд┐рдирд╛ рдЦреЛрдЬ рдХреЛ рд░рд╣рд╕реНрдп рдмрдирд╛рдпреЗ рд░рдЦрдирд╛

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЗрдВ рддрдХрдиреАрдХреЗрдВ рдорд┐рд▓рд╛рдХрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ search рдмреЙрдХреНрд╕ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрд░рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рдХрд╛ рдХреНрд░рдо рд╕реНрдкрд╖реНрдЯ рд░рд╣реЗ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо predictable рд▓рдЧреЗрдВред

рдПрдХ рд╕рд░рд▓ priority order рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ рдХреНрд╡реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдпрд╛ рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕реНрдкрд╖реНрдЯ CASE рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рдеред

рдПрдХ predictable priority ladder

рдХрдареЛрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдлрд┐рд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдФрд░ fuzzier рдмрдиреЗрдВ:

  • Exact match рдкрд╣рд▓реЗ (IDs, email, ticket number, SKU) B-tree рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
  • Prefix match рдЬрд╣рд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╣реЛ
  • Trigram match рдЙрд╕рдХреЗ рдмрд╛рдж typos рдФрд░ fragments рдХреЗ рд▓рд┐рдП names рдФрд░ titles рдкрд░
  • Full-text search рдЕрдВрдд рдореЗрдВ рд▓рдВрдмреА notes, descriptions рдФрд░ free-form content рдХреЗ рд▓рд┐рдП

рдЬрдм рдЖрдк рдПрдХ рд╣реА ladder рдлреЙрд▓реЛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реАрдЦ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдмреЙрдХреНрд╕ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд╡реЗ рдпрд╣ рд╕реЛрдЪрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ рдЬрдм "12345" рддреБрд░рдВрдд рдЯрд┐рдХрдЯ рдвреВрдБрдв рд▓реЗ рд░рд╣рд╛ рд╣реИ рдЬрдмрдХрд┐ "refund policy" рд▓рдВрдмреА рдЯреЗрдХреНрд╕реНрдЯ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реИред

рдкрд╣рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░, рдлрд┐рд░ рдлрдЬреА

рдлрдЬреА рдЦреЛрдЬ рдорд╣рдБрдЧреА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрдм рдЙрд╕реЗ рдкреВрд░реА рдЯреЗрдмрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред candidate рд╕реЗрдЯ рдХреЛ рдЙрди рдлрд╝рд┐рд▓реНрдЯрд░реЛрдВ рд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░реЗрдВ рдЬреЛ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (status, assigned team, date range, account), рдлрд┐рд░ рд╢реЗрд╖ рдкрд░ trigram рдпрд╛ full-text рдЪрд▓рд╛рдПрдВред рдПрдХ рддреЗрдЬрд╝ рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕ рднреА рдзреАрдорд╛ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЦреЛрдВ rows рдкрд░ score рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдПрдХ non-technical рд╕рд╣рдХрд░реНрдореА рд╕рдордЭ рд╕рдХреЗ рдРрд╕рд╛ рдПрдХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдирд┐рдпрдо рд▓рд┐рдЦреЗрдВ, рдЬреИрд╕реЗ: тАЬрд╣рдо рдкрд╣рд▓реЗ ticket number рдХреЛ exact рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ typo-tolerant customer name, рдлрд┐рд░ notes рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВредтАЭ рдпрд╣ рд╕рд╛рдЭрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрд╛рдж рдореЗрдВ рдмрд╣рд╕реЛрдВ рдХреЛ рд░реЛрдХреЗрдЧреА рдХрд┐ рдХрд┐рд╕реА row рдХрд╛ рджрд┐рдЦрдирд╛ рдХреНрдпреЛрдВ рд╣реБрдЖред

рдЪрд░рдг-рджрд░-рдЪрд░рдг: рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдиреЗрдВ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдкрд╣рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░, рдлрд┐рд░ рдлрдЬреА
рдлрдЬреА рдЦреЛрдЬ рд╕рд╕реНрддреА рд░рд╣реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ default рдлрд╝рд┐рд▓реНрдЯрд░ (рдЬреИрд╕реЗ status рдФрд░ workspace) рдЬреЛрдбрд╝реЗрдВред
рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ

рдПрдХ рддреЗрдЬрд╝ тАЬsearch everywhereтАЭ рдмреЙрдХреНрд╕ рдЫреЛрдЯреЗ рдлреИрд╕рд▓реЛрдВ рдХрд╛ рд╕реЗрдЯ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗрдВ, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдХрд╛рдо рд╕рд░рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

  1. Define the inputs. рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмреЙрдХреНрд╕ рд╣реИ, рдпрд╛ рдПрдХ рдмреЙрдХреНрд╕ + рдлрд╝рд┐рд▓реНрдЯрд░ (status, owner, date range)?
  2. Choose match types per field. IDs рдФрд░ codes exact match рдЪрд╛рд╣рддреЗ рд╣реИрдВред Names рдФрд░ emails рдЕрдХреНрд╕рд░ prefix рдпрд╛ fuzzy matching рдЪрд╛рд╣рддреЗ рд╣реИрдВред Long notes рдФрд░ descriptions рдХреЗ рд▓рд┐рдП natural language search рдмреЗрд╣рддрд░ рд╣реИред
  3. Add the right indexes and confirm theyтАЩre used. рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВ, рдлрд┐рд░ рдЕрдкрдиреА рдЕрд╕рд▓реА рдХреНрд╡реЗрд░реА рдХреЛ EXPLAIN (ANALYZE, BUFFERS) рд╕реЗ рдЪреЗрдХ рдХрд░реЗрдВред
  4. Add ranking or sorting that matches intent. рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ тАЬinvoice 1042тАЭ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ exact matches рдКрдкрд░ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рд╡реЗ рдЧрд▓рдд рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдирд╛рдо рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ similarity ranking рдкреНрд░рдореБрдЦ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  5. Test with real queries. рдЯрд╛рдЗрдкреЛ, рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╢рдмреНрдж (рдЬреИрд╕реЗ тАЬalтАЭ), рд▓рдВрдмрд╛ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реБрдЖ рдЯреЗрдХреНрд╕реНрдЯ, рдЦрд╛рд▓реА рдЗрдирдкреБрдЯ, рдФрд░ тАЬрдХреЗрд╡рд▓ рдлрд╝рд┐рд▓реНрдЯрд░тАЭ рдореЛрдб рдЖрдЬрдорд╛рдПрдВред

рд╕реБрд░рдХреНрд╖рд┐рдд рд╢рд┐рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ рдФрд░ rollback рдЖрд╕рд╛рди рд░рдЦреЗрдВред рдмрдбрд╝реЗ рдЯреЗрдмрд▓ рдкрд░ рдирдП рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП CREATE INDEX CONCURRENTLY рдЪреБрдиреЗрдВ рддрд╛рдХрд┐ рдЖрдк writes рдХреЛ рдмреНрд▓реЙрдХ рди рдХрд░реЗрдВред рдЕрдЧрд░ рд╕рдВрднрд╡ рд╣реЛ рддреЛ feature flag рдХреЗ рдкреАрдЫреЗ рд╢рд┐рдк рдХрд░реЗрдВ рдФрд░ latency рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░реЗрдВред

тАЬPostgreSQL search everywhereтАЭ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреИрдЯрд░реНрди рд╣реИ: рдкрд╣рд▓реЗ exact match (рддреЗрдЬрд╝ рдФрд░ рд╕рдЯреАрдХ), рдлрд┐рд░ рдЯреНрд░рд┐рдЧреНрд░рд╛рдо matching рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ рд▓реЛрдЧ misspell рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд▓рдВрдмреА рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП full-text searchред

рдПрдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдг: support admin panel рдореЗрдВ рдПрдХ search рдмреЙрдХреНрд╕

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдПрдХ support admin panel рдЬрд╣рд╛рдБ рдЯреАрдо рдПрдХ search рдмреЙрдХреНрд╕ рдЪрд╛рд╣рддреА рд╣реИ, рдкрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд╣ customers, tickets рдФрд░ рдпрд╣рд╛рдБ рддрдХ рдХрд┐ notes рдХреЛ рднреА рдвреВрдВрдвреЗред рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ тАЬрдПрдХ рдЗрдирдкреБрдЯ, рдХрдИ рдорд╛рдпрдиреЗтАЭ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдкрд╣рд▓реА рдЬреАрдд рд╣реИ intent рдХреЛ friction рдХреЗ рдмрд┐рдирд╛ рджрд┐рдЦрд╛рдирд╛ред рдЕрдЧрд░ рдХреНрд╡реЗрд░реА рдПрдХ рдИрдореЗрд▓ рдпрд╛ рдлреЛрди рдирдВрдмрд░ рдЬреИрд╕реА рджрд┐рдЦрддреА рд╣реИ рддреЛ рдЙрд╕реЗ customer lookup рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВред рдЕрдЧрд░ рдпрд╣ рдЯрд┐рдХрдЯ ID рдЬреИрд╕реА рджрд┐рдЦрддреА рд╣реИ (рдЙрджрд╛. "TKT-10482") рддреЛ рд╕реАрдзреЗ tickets рдкрд░ рд░реВрдЯ рдХрд░реЗрдВред рдмрд╛рдХреА рд╕рдм ticket subject рдФрд░ notes рдкрд░ text search рдХреЗ fallback рдореЗрдВ рдЬрд╛рдПред

customer lookup рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕ рдЖрдо рддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рджреЗрддреЗ рд╣реИрдВред рдирд╛рдо рдФрд░ company strings рдЧрдВрджреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд▓реЛрдЧ fragments рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕ тАЬjon smiтАЭ рдпрд╛ тАЬacmтАЭ рдЬреИрд╕реА рдЦреЛрдЬреЛрдВ рдХреЛ рддреЗрдЬрд╝ рдФрд░ рд╕рд╣рдирд╢реАрд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

ticket notes рдХреЗ рд▓рд┐рдП full-text search рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред notes рд╡рд╛рдХреНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдореИрдЪ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ substringред рдЬрдм рдХрдИ рдЯрд┐рдХрдЯ рдПрдХ рд╣реА рдХреАрд╡рд░реНрдб рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ ranking рдорджрдж рдХрд░рддреА рд╣реИред

рдлрд╝рд┐рд▓реНрдЯрд░ рдЙрд╕ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд┐рддрдирд╛ рдХрдИ рдЯреАрдореЗрдВ рд╕реЛрдЪрддреА рд╣реИрдВред рдЕрдЧрд░ agents тАЬopen ticketsтАЭ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ partial index рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдХреЗрд╡рд▓ open rows рдХреЛ рдХрд╡рд░ рдХрд░реЗред active customers рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВред рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рдЫреЛрдЯреЗ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп path рдХреЛ рддреЗрдЬрд╝ рдмрдирд╛рддрд╛ рд╣реИред

рдмрд╣реБрдд рдЫреЛрдЯреЗ рдХреНрд╡реЗрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдмрдирд╛рдПрдВ, рдЕрдиреНрдпрдерд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдорд╣рдБрдЧрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

  • 1тАУ2 characters: рд╣рд╛рд▓ рдХреЗ open tickets рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╣реБрдП customers рджрд┐рдЦрд╛рдПрдБ
  • 3+ characters: рдЧреНрд░рд╛рд╣рдХ рдлрд╝реАрд▓реНрдбреНрд╕ рдкрд░ trigram рдФрд░ рдЯрд┐рдХрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдкрд░ full-text рдЪрд▓рд╛рдПрдБ
  • рд╕реНрдкрд╖реНрдЯ intent рди рд╣реЛрдиреЗ рдкрд░: рдорд┐рд╢реНрд░рд┐рдд рд╕реВрдЪреА рджрд┐рдЦрд╛рдПрдБ, рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЛ cap рдХрд░реЗрдВ (рдЙрджрд╛. 10 customers рдФрд░ 10 tickets)

рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдЦреЛрдЬ рдХреЛ рдзреАрдорд╛ рдпрд╛ рднреНрд░рдорд┐рдд рдХрд░ рджреЗрддреА рд╣реИрдВ

Search рдХреЛ AI рд╕реЗ Extend рдХрд░реЗрдВ
рдЬрдм рдЖрдкрдХреЛ smarter internal search рдпрд╛ ticket triage рдЪрд╛рд╣рд┐рдП рддреЛ AI integrations рдЬреЛрдбрд╝реЗрдВред
AI рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдВ

рдЕрдзрд┐рдХрд╛рдВрд╢ тАЬрд╕рд░реНрдЪ рдзреАрдореА рдХреНрдпреЛрдВ рд╣реИ?тАЭ рдмрдЧ рдЦреБрдж-рд╕реГрдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд▓рдХреНрд╖реНрдп рд╣рд░ рдЪреАрдЬрд╝ рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрдБрд╕рдиреЗ рд╡рд╛рд▓реА рдЧрд▓рддреА рд╣реИ рдХрдИ рдХреЙрд▓рдореНрд╕ рдкрд░ тАЬрдмрд╕ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВтАЭ рдЗрдВрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝рдирд╛ред рдкрдврд╝рд╛рдИ рддреЗрдЬрд╝ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдкрд░ рд╣рд░ insert рдФрд░ update рдЕрдм рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред internal tools рдореЗрдВ рдЬрд╣рд╛рдБ рд░рд┐рдХреЙрд░реНрдб рджрд┐рди рднрд░ рдмрджрд▓рддреЗ рд░рд╣рддреЗ рд╣реИрдВ (tickets, orders, users), write speed рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред

рдПрдХ рдФрд░ рдЧрд▓рддреА рд╣реИ full-text search рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрдм рдЖрдкрдХреЛ рдЕрд╕рд▓ рдореЗрдВ рдирд╛рдореЛрдВ рдпрд╛ рдИрдореЗрд▓реНрд╕ рдкрд░ typo-tolerant lookup рдЪрд╛рд╣рд┐рдП рд╣реЛрддрд╛ рд╣реИред Full-text рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рдпрд╣ тАЬJonтАЭ рдмрдирд╛рдо тАЬJohnтАЭ рдпрд╛ тАЬgmail.conтАЭ рдмрдирд╛рдо gmail.com рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рджреВ рдХрд╛ рдЗрд▓рд╛рдЬ рдирд╣реАрдВ рд╣реИтАФрдпрд╣ рдЖрдорддреМрд░ рдкрд░ trigram рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рднреА рдЪреБрдкрдХреЗ рд╕реЗ рдЖрдкрдХреЗ рдкреНрд▓рд╛рди рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреЛрдЬреЗрдВ рдПрдХ рдлрд┐рдХреНрд╕реНрдб рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВ (рдЬреИрд╕реЗ status = 'open' рдпрд╛ org_id = 42), рддреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЗрдВрдбреЗрдХреНрд╕ partial index рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ condition рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ PostgreSQL рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ rows рд╕реНрдХреИрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рдмрд╛рд░-рдмрд╛рд░ рджрд┐рдЦрддреА рд╣реИрдВ:

  • рдмрд┐рдирд╛ write рд▓рд╛рдЧрдд рдорд╛рдкреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЗрдВрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝рдирд╛
  • full-text рд╕реЗ error-tolerant autocomplete рдХреА рдЙрдореНрдореАрдж рд░рдЦрдирд╛
  • рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рдпрд╣ рди рд╕рдордЭрдирд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдЗрдВрдбреЗрдХреНрд╕ рдЙрдкрдпреЛрдЧ рд╣реЛрдЧрд╛
  • рдЫреЛрдЯреЗ, рд╕рд╛рдлрд╝ рдбреЗрдЯрд╛ рдкрд░ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рдмрдЬрд╛рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ term frequency рдкрд░ (common words рдмрдирд╛рдо rare IDs)
  • рдмрд┐рдирд╛ supporting index рдХреЗ рдХрд┐рд╕реА рдХреЙрд▓рдо рдкрд░ sort рдХрд░рдирд╛, рдЬрд┐рд╕рд╕реЗ slow sort рдордЬрдмреВрд░ рд╣реЛрддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд╕рдкреЛрд░реНрдЯ рд╕реНрдХреНрд░реАрди tickets рдХреЛ subject, customer name, рдФрд░ ticket number рд╕реЗ рдЦреЛрдЬрддреА рд╣реИ, рдлрд┐рд░ latest activity рджреНрд╡рд╛рд░рд╛ sort рдХрд░рддреА рд╣реИред рдЕрдЧрд░ latest_activity_at filtered set (рдЙрджрд╛. open tickets) рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд╣ sort рдЖрдкрдиреЗ search index рд╕реЗ рдЬреЛ рдЧрддрд┐ рдкрд╛рдИ рдереА рдЙрд╕реЗ рдирд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╢рд┐рдк рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд╡рд░рд┐рдд рдЪреЗрдХ

рдЬрд╣рд╛рдБ рдЪрд╛рд╣рд┐рдП рд╡рд╣рд╛рдВ Deploy рдХрд░реЗрдВ
рдЕрдкрдиреА internal tool рдХреЛ AppMaster Cloud рдпрд╛ рдЕрдкрдиреА AWS, Azure, рдпрд╛ Google Cloud рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВред
рдЕрдм рддреИрдирд╛рдд рдХрд░реЗрдВ

тАЬSearch everywhereтАЭ рдлреАрдЪрд░ рдХреЛ рдкреВрд░рд╛ рдХрд╣рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдареЛрд╕ рдмрдиреЗрдВ рдЬреЛ рдЖрдк рд╡рд╛рджрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

  • рдХреНрдпрд╛ рд▓реЛрдЧ рдПрдХ exact identifier (ticket number, email) рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдвреВрдБрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
  • рдХреНрдпрд╛ рд╡реЗ рдЯрд╛рдЗрдкреЛ рдХреЗ рд▓рд┐рдП fuzzy matching рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд░рдЦрддреЗ рд╣реИрдВ?
  • рдХреНрдпрд╛ рд╡реЗ рд▓рдВрдмреА рдиреЛрдЯреНрд╕ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ ranked results рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдЕрдЧрд░ рдЖрдк рдореЛрдбреНрд╕ рдХреЛ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рддрдп рдХрд░реЗрдВ рдХрд┐ рдЯрдХрд░рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рдХреМрди рдЬреАрддрддрд╛ рд╣реИред

рдлрд┐рд░ 2тАУ3 рдлрд╝реАрд▓реНрдб рдкрд╣рдЪрд╛рдиреЗрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреЛрдЬреЛрдВ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ 80% рдЦреЛрдЬреЗрдВ email, name, рдФрд░ ticket ID рд╕реЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ optimize рдХрд░реЗрдВ рдФрд░ рдмрд╛рдХреА рдХреЛ рджреНрд╡рд┐рддреАрдпрдХ рдорд╛рдиреЗрдВред

рдПрдХ рдЫреЛрдЯрд╛ pre-ship рдЪреЗрдХрд▓рд┐рд╕реНрдЯ:

  • рдкреНрд░рддрд┐ рдлрд╝реАрд▓реНрдб рдореБрдЦреНрдп match рдореЛрдб рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ (exact lookup, fuzzy match, рдпрд╛ ranked text)
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░реЛрдЬрд╝ рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдЙрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ
  • рдмрд╣реБрдд рдЫреЛрдЯреЗ рдФрд░ рдЦрд╛рд▓реА рдХреНрд╡реЗрд░рд┐рдпреЛрдВ (рдЙрджрд╛. fuzzy search рдХреЗ рд▓рд┐рдП 2тАУ3 characters рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛) рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрдп рдХрд░реЗрдВ; рдЦрд╛рд▓реА рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓рд┐рдпрд╛ рджрд┐рдЦрд╛рдПрдБ
  • ordering рдХреЛ explainable рдмрдирд╛рдПрдВ: most recent, best text match, рдпрд╛ рд╕рд░рд▓ combined rule

рдЕрдВрдд рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕рд╛рдЗрдЬрд╝ рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ, рд╕рд┐рд░реНрдлрд╝ correctness рдХреЗ рд╕рд╛рде рдирд╣реАрдВред 1,000 rows рдкрд░ рддреБрд░рдВрдд рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рдХреНрд╡реЗрд░реА 1,000,000 рдкрд░ рднрд╛рд░реА рдкрдбрд╝ рд╕рдХрддреА рд╣реИред

рдЕрдЧрд▓реЗ рдХрджрдо: рдпреЛрдЬрдирд╛ рдХреЛ рддреЗрдЬ internal search рд╕реНрдХреНрд░реАрди рдореЗрдВ рдмрджрд▓реЗрдВ

рдПрдХ search рдмреЙрдХреНрд╕ рддрдм рддреЗрдЬрд╝ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рдЯреАрдо рдЗрд╕ рдкрд░ рд╕рд╣рдордд рд╣реЛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░реЗрдЧреАред рд╕реНрдкрд╖реНрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рдпрдо рд▓рд┐рдЦреЗрдВ: тАЬрдорд┐рд▓рдирд╛тАЭ рдХрд╛ рдорддрд▓рдм рдХреНрдпрд╛ рд╣реИ (exact, prefix, typo-tolerant), рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рдЦреЛрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВред

рдПрдХ рдЫреЛрдЯрд╛ test set рд░рдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦреЛрдЬреЗрдВ рд╣реЛрдВ рдФрд░ рдЙрд╕реЗ regression suite рдХреА рддрд░рд╣ рджреЗрдЦреЗрдВред рджрд╕ рд╕реЗ рдмреАрд╕ рдХреНрд╡реЗрд░реА рдЖрдорддреМрд░ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ: рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо, рдХреБрдЫ рдЖрдВрд╢рд┐рдХ рдИрдореЗрд▓, рдПрдХ рдЯрд╛рдЗрдкреЛ, рдПрдХ рд▓рдВрдмрд╛ рдиреЛрдЯ рд╕реНрдирд┐рдкреЗрдЯ, рдФрд░ рдПрдХ тАЬрдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВтАЭ рдХреЗрд╕ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдПрдБ рддрд╛рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рдо рдЪреБрдкрдХреЗ рд╕реЗ relevance рдХреЛ рди рддреЛрдбрд╝ рджреЗред

рдЕрдЧрд░ рдЖрдк internal tools AppMaster (appmaster.io) рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрди search рдирд┐рдпрдореЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдФрд░ рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рд╣рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ UI рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд┐рдХрд▓реНрдк рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдмрджрд▓рдиреЗ рдкрд░ рдЕрд▓рдЧ рди рд╣реЛ рдЬрд╛рдПрдБред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди

рдПрдХ internal рдЯреВрд▓ рдореЗрдВ тАЬsearch everywhereтАЭ рдХрд╛ рдорддрд▓рдм рдЖрдорддреМрд░ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рдЗрд╕реЗ тАЬрдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдвреВрдБрдвреЛтАЭ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдХреА рддрд░рд╣ рдирд╣реАрдВред рдкрд╣рд▓реЗ рдЙрди рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд░рддреЗ рд╣реИрдВ (ID lookup, рдирд╛рдо/рдИрдореЗрд▓ lookup рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдкреЛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓рдВрдмреА рдиреЛрдЯреНрд╕ рдореЗрдВ рдЦреЛрдЬ) рдФрд░ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛ рд╡реЗ рдЕрдХреНрд╕рд░ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдпреЗ рдирд┐рд░реНрдгрдп рдмрддрд╛рдпреЗрдВрдЧреЗ рдХрд┐ рдХреМрди рд╕реА рдХреНрд╡реЗрд░рд┐рдпрд╛рдБ рдЪрд▓рд╛рдиреА рд╣реИрдВ рдФрд░ рдХрд┐рди рдЗрдВрдбреЗрдХреНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИред

`ILIKE '%...%'` рдХреНрдпреЛрдВ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ?

ILIKE '%term%' рдореЗрдВ leading wildcard рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП PostgreSQL рдЖрдорддреМрд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп B-tree рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рддрд╛ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ rows рд╕реНрдХреИрди рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЫреЛрдЯреЗ рдЯреЗрдмрд▓ рдкрд░ рдареАрдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдмрдврд╝реЗрдЧрд╛ рдпрд╣ рддреЗрдЬрд╝реА рд╕реЗ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЛ substring рдпрд╛ typo-tolerant matching рдЪрд╛рд╣рд┐рдП рддреЛ ILIKE рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп trigram рдпрд╛ full-text рдХреЗ рд▓рд┐рдП рдкреНрд▓рд╛рди рдмрдирд╛рдПрдВред

IDs рдпрд╛ рдИрдореЗрд▓ рдЬреИрд╕реЗ exact lookups рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

WHERE id = $1 рдпрд╛ WHERE email = $1 рдЬреИрд╕реА exact comparisons рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ B-tree (рдЕрдХреНрд╕рд░ emails рдпрд╛ codes рдХреЗ рд▓рд┐рдП unique) рд╕реЗ рд╕рдкреЛрд░реНрдЯ рдХрд░рд╛рдПрдВред Exact lookups рд╕рдмрд╕реЗ рд╕рд╕реНрддреЗ searches рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рднреА predictable рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреВрд░рд╛ ticket number рдпрд╛ email paste рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдкрд╣рд▓реЗ рдЗрд╕ рд░рд╛рд╕реНрддреЗ рдкрд░ рд░рд╛рдЙрдЯ рдХрд░реЗрдВред

рдХреИрд╕реЗ case-insensitive prefix search рдХрд░реЗрдВ рдмрд┐рдирд╛ рдЗрдВрдбреЗрдХреНрд╕ рддреЛрдбрд╝реЗ?

рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рд╣реИ prefix рдкреИрдЯрд░реНрди рдЬреИрд╕реЗ name ILIKE 'ann%' рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдЖрдкрдиреЗ рд╡рд╣реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЗрдВрдбреЗрдХреНрд╕ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХреНрд╡реЗрд░реА рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп case-insensitive рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдХрдИ рдЯреАрдореЗрдВ lower(name) рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЙрд╕реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреА рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд▓рд╛рдирд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗред рдЕрдЧрд░ рдкреИрдЯрд░реНрди рд╢реБрд░реБрдЖрдд рдкрд░ anchor рдирд╣реАрдВ рд╣реИ рддреЛ prefix search рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдХрд┐рд╕ рд╕рдордп search рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП trigram рдЗрдВрдбреЗрдХреНрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ fragments рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рд╣рд▓реНрдХреА рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд╕рд┐рд░реНрдлрд╝ тАЬрдХреБрдЫ рдЬреИрд╕рд╛тАЭ рдпрд╛рдж рд░рдЦрддреЗ рд╣реИрдВтАФрдЦрд╛рд╕рдХрд░ рдЫреЛрдЯреЗ рдлрд╝реАрд▓реНрдбреНрд╕ (names, subjects, codes, usernames)тАФрддреЛ trigram рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИред рдпрд╣ рд╢рдмреНрдж рдХреЗ рдмреАрдЪ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рднреА рдореИрдЪ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ misspellings рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдХрд┐рдиреНрддреБ рдЯреНрд░рд┐рдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдХреНрд╕ рдмрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ writes рдкрд░ рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдХреЙрд▓рдореНрд╕ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░реЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЛрдЧ рд╕рдЪрдореБрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдХрдм PostgreSQL full-text search рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

рдЬрдм рд▓реЛрдЧ рд╡рд╛рдХреНрдп рдпрд╛ рдХреАрд╡рд░реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЛрдЬрддреЗ рд╣реИрдВтАФрдЬреИрд╕реЗ рдиреЛрдЯреНрд╕, рд╕рдВрджреЗрд╢, рд╡рд┐рд╡рд░рдг рдпрд╛ knowledge-baseтАФрддреЛ full-text search рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреА рдмрдбрд╝реА рдЬреАрдд relevance ranking рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдкрд░рд┐рдгрд╛рдо рдКрдкрд░ рдЖрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди stemming рдФрд░ stop-word removal рдХрд░рддреА рд╣реИ, рдЬреЛ prose рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдкрд░ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪреМрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред

Partial indexes тАЬsearch everywhereтАЭ рд╕реНрдХреНрд░реАрди рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ?

рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреЛрдЬреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рдЧрд╛рддрд╛рд░ рд▓рдЧреЗ рд╣реЛрдВтАФрдЬреИрд╕реЗ deleted_at IS NULL, status = 'open', рдпрд╛ tenant/workspace constraintтАФрддреЛ partial indexes рдЬреЛрдбрд╝реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп subset рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЫреЛрдЯрд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдХрд▓реЛрдб рдореЗрдВ рддреЗрдЬрд╝ рд░рд╣рддрд╛ рд╣реИред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ рд╡рд╣реА рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди condition рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ partial index рдореЗрдВ рд╣реИ, рд╡рд░рдирд╛ PostgreSQL рдЙрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

Exact, trigram, рдФрд░ full-text search рдХреЛ рдХреИрд╕реЗ рдорд┐рд▓рд╛рдХрд░ рдпреВрдЬрд╝ рдХрд░реЗрдВ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд┐рдП?

рдПрдХ consistent priority ladder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо predictable рд▓рдЧреЗрдВ: IDs/emails рдХреЗ рд▓рд┐рдП exact match рдкрд╣рд▓реЗ, рдлрд┐рд░ рдЬрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛ prefix, рдЙрд╕рдХреЗ рдмрд╛рдж names/titles рдкрд░ рдЯреНрд░рд┐рдЧреНрд░рд╛рдо, рдФрд░ рд▓рдВрдмреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ full-textред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдЬрд▓реНрджреА рд▓рд╛рдЧреВ рдХрд░реЗрдВ рддрд╛рдХрд┐ fuzzy search рдХреЛ рдХрдо rows рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝реЗред рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдмрдврд╝рдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рд░реЗрдВрдбрдо рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реЛрдЧреАред

1тАУ2 рдЕрдХреНрд╖рд░ рдХреА рдЦреЛрдЬреЛрдВ рдпрд╛ рдЦрд╛рд▓реА рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╕рд░рд▓ рдирд┐рдпрдо рд░рдЦреЗрдВ рдЬреИрд╕реЗ fuzzy search рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ 3+ characters рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛, рдФрд░ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЗрдирдкреБрдЯ рдкрд░ рд╣рд╛рд▓ рдХреА рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдХреЙрд░реНрдб рджрд┐рдЦрд╛рдПрдВред 1тАУ2 рд╡рд░реНрдг рд╡рд╛рд▓реЗ рд╕рд░реНрдЪ рд╢реЛрд░ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдХрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдорд╣рдВрдЧрд╛ рдХрд╛рдо рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред empty input рдХреЗ рд▓рд┐рдП рднреА рддрдп рдХрд░реЗрдВ рдХрд┐ UI рдХреНрдпрд╛ рджрд┐рдЦрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ тАЬmatch everythingтАЭ рдХрд╛ рднрд╛рд░ рди рдкрдбрд╝реЗред

рдореИрдВ performance рдХреЛ рдХреИрд╕реЗ validate рдХрд░реВрдБ рдФрд░ search рдмрджрд▓рд╛рд╡ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╢рд┐рдк рдХрд░реВрдБ?

рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╣реА EXPLAIN (ANALYZE, BUFFERS) рдХреЗ рд╕рд╛рде рдЕрд╕рд▓реА рдХреНрд╡реЗрд░реА рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕рд╛рдЗрдЬрд╝ рдкрд░ рдЬрд╛рдВрдЪреЗрдВ, рд╕рд┐рд░реНрдлрд╝ dev dataset рдкрд░ рдирд╣реАрдВред рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд░реЛрд▓рдЖрдЙрдЯ рдХрд░реЗрдВ рдФрд░ rollback рдЖрд╕рд╛рди рд░рдЦреЗрдВ; рдмрдбрд╝реЗ рдЯреЗрдмрд▓ рдкрд░ рдирдП рдЗрдВрдбреЗрдХреНрд╕ CREATE INDEX CONCURRENTLY рд╕реЗ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ writes рдмреНрд▓реЙрдХ рди рд╣реЛрдВред рдЕрдЧрд░ рдЖрдк screen AppMaster рдореЗрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ search рдирд┐рдпрдореЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдФрд░ рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ UI рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдордп рдХреЗ рд╕рд╛рде рди рдмрджрд▓реЗред

рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди
рдХреБрдЫ рдмрдирд╛рдПрдВ рдЕрджреНрднреБрдд

рдлреНрд░реА рдкреНрд▓рд╛рди рдХреЗ рд╕рд╛рде рдРрдкрдорд╛рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
рдЬрдм рдЖрдк рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ рддрдм рдЖрдк рдЙрдЪрд┐рдд рд╕рджрд╕реНрдпрддрд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ
PostgreSQL рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬ: рдкреВрд░реНрдг-рдкрд╛рда, рдЯреНрд░рд┐рдЧреНрд░рд╛рдо, рдЖрдВрд╢рд┐рдХ рдЗрдВрдбреЗрдХреНрд╕ | AppMaster