Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

ΠŸΠΎΠ»Π½ΠΎΡ‚Π΅ΠΊΡΡ‚ΠΎΠ²Ρ‹ΠΉ поиск ΠΏΠΎ сайту β€” Π±ΠΈΡ‡ соврСмСнного ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°

РСализация Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ поиска ΠΏΠΎ сайту β€” часто сильно нСдооцСнСнная ΠΏΠΎ слоТности Π·Π°Π΄Π°Ρ‡Π°. Поиск являСтся слабым мСстом сайтов Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ часто, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° я Π²ΠΈΠΆΡƒ строку поиска, Ρƒ мСня сразу ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ прСдвзятоС ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅ прСдстоящСго фиаско. И Ρ‡Ρ‚ΠΎΠ±Ρ‹ лишний Ρ€Π°Π· Π½Π΅ Ρ€Π°ΡΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ, я сразу ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΡƒΡŽ свой вопрос Π³ΡƒΠ³Π»Ρƒ ΠΈΠ»ΠΈ яндСксу ΠΈ быстро Π½Π°Ρ…ΠΎΠΆΡƒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ. Π§Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ?

Π€ΠΎΡ€ΠΌΠ° поиска ΠΏΠΎ сайту ΠΎΡ‚ ЯндСкса ΠΈ Π“ΡƒΠ³Π»Π°

ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ поиска

Для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΈΠ· Ρ‡Π΅Π³ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ складываСтся понятиС качСства поиска. ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ поиска зависит ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ². О ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΠΊΠ½ΠΈΠ³Π΅ извСстного поискового ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π° тСхничСских Π½Π°ΡƒΠΊ Π˜Π³ΠΎΡ€Ρ Ашманова. (Π‘ΠΊΠ°ΠΆΡƒ ΠΏΠΎ сСкрСту, Ρ‡Ρ‚ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Π²ΠΈΠ΄Π΅Π» Π΅Ρ‘ Π½Π° torrents.ru). ВсС Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹ условно ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° Ρ‚Ρ€ΠΈ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ: ΠΏΠΎΠ»Π½ΠΎΡ‚Π°, Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π°Π½ΠΆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

ΠŸΠΎΠ»Π½ΠΎΡ‚Π°

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого Ρ‡Π°Ρ‰Π΅ всСго Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ сайтов Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ поиск Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ динамичСским Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ поисковая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ вСбмастСр (ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ CMS) Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π‘Π” самыС Π²Π°ΠΆΠ½Ρ‹Π΅, Π° ΠΊΠ°ΠΊΠΈΠ΅ нСдостойны внимания. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Β«Π·Π° Π±ΠΎΡ€Ρ‚ΠΎΠΌΒ» поиска ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Β«ΠΌΠ°Π»ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅Β» динамичСскиС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ всС статичСскиС страницы.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΡŒΡŽ обСспСчСниС максимальной ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ поиска, Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΌΠ½ΠΎΠ³ΠΎ «мусорных» ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ…ΡΡ страниц, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ сказываСтся Π½Π° Π»ΠΎΡΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ поиска β€” это характСристика соотвСтствия Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… страниц поисковому запросу. Π’ Π½Π΅Ρ‘ входят ΡƒΡ‡Π΅Ρ‚ ΠΌΠΎΡ€Ρ„ΠΎΠ»ΠΎΠ³ΠΈΠΈ, снятиС ΠΎΠΌΠΎΠ½ΠΈΠΌΠΈΠΈ, ΡƒΡ‡Π΅Ρ‚ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ, поиск ΠΏΠΎ синонимам ΠΈ Π΄Ρ€. НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΡ‰Π΅Ρ‚ «количСство Π³ΠΎΠ»ΠΎΠ² ΠΡ€ΡˆΠ°Π²ΠΈΠ½Π°Β», Ρ‚ΠΎ ясно, Ρ‡Ρ‚ΠΎ Π³ΠΎΠ»ΠΎΠ²Ρ‹ Ρ‚ΡƒΡ‚ Π½ΠΈ ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ, ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎ Π·Π°Π±ΠΈΡ‚Ρ‹Π΅ Π³ΠΎΠ»Ρ‹. Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΌΠΎΠ½ΠΈΠΌΠΈΠΈ. Но это Π²Ρ‹ΡΡˆΠΈΠΉ ΠΏΠΈΠ»ΠΎΡ‚Π°ΠΆ, Π° самоС простоС, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ β€” это поиск ΠΏΠΎ всСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ словоформам.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

МСга-Π£Ρ‡Π΅Π±Π½ΠΈΠΊ Flask, Π§Π°ΡΡ‚ΡŒ 10: ΠŸΠΎΠ»Π½ΠΎΡ‚Π΅ΠΊΡΡ‚ΠΎΠ²Ρ‹ΠΉ поиск

Π­Ρ‚ΠΎ дСсятая ΡΡ‚Π°Ρ‚ΡŒΡ Π² сСрии, Π³Π΄Π΅ я ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽ свой ΠΎΠΏΡ‹Ρ‚ написания Π²Π΅Π±-прилоТСния Π½Π° Python с использованиСм ΠΌΠΈΠΊΡ€ΠΎΡ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Flask.

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»ΠΈ наши запросы Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈ посты Π½Π° страницу.

БСгодня ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с нашСй Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ. ВсС прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ поиска.

Для ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π²Π΅Π±-сайтов ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Google, Bing, ΠΈ Ρ‚.ΠΏ. ΠΏΡ€ΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с сайтами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π² основС статичСскиС страницы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΡƒΠΌ. Π’ нашСм малСньком ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ базовая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° это ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ пост, Π° Π½Π΅ цСлая страница. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ссли ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ слово Β«dogΒ» ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ всС сообщСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ это слово. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ страница Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° поиска Π½Π΅ сущСствуСт Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Ρ‚ поиск, поэтому поисковики Π½Π΅ смогут ΠΏΡ€ΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² систСмы полнотСкстового поиска

К соТалСнию ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° полнотСкстового поиска Π² рСляционных Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ стандартизирована. КаТдая Π±Π°Π·Π° Π΄Π°Π½Π½Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ полнотСкстовый поиск ΠΏΠΎ-своСму, ΠΈ SQLAlchemy Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π° этот случай подходящСй абстракции.

ΠœΡ‹ сСйчас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ SQLite для нашСй Π±Π°Π·Ρ‹, поэтому ΠΌΡ‹ просто ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ полнотСкстовый индСкс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ возмоТности прСдоставялСмыС SQLite, Π² ΠΎΠ±Ρ…ΠΎΠ΄ SQLAlchemy. Но это плохая идСя, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π² ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΌ придСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ наш полнотСкстовый поиск для Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

ВмСсто этого, ΠΌΡ‹ собираСмся ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Π±Π°Π·Ρƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π±Π°Π·Ρƒ для поиска.

Π•ΡΡ‚ΡŒ нСсколько систСм полнотСкстового поиска с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ. Волько ΠΎΠ΄Π½Π°, насколько ΠΌΠ½Π΅ извСстно, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Flask Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Whoosh, ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ Π΅Π΅ Ρ‚ΠΎΠΆΠ΅ написан Π½Π° Python. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ использования чистого Python это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ доступСн Python. НСдостатком являСтся ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ поиска, которая Π½Π΅ сравнится с Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ написанными Π½Π° C ΠΈΠ»ΠΈ C++. На ΠΌΠΎΠΉ взгляд Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для Flask ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ соСдинятся с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ систСмами ΠΈ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нас ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π΅Ρ‚ Flask-SQLAlchemy освобоТдая нас ΠΎΡ‚ ньюансов Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Π² области полнотСкстового поиска Π½Π΅Ρ‚ ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π° Django ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ систСмы полнотСкстового поиска Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ django-haystack. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ создаст Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для Flask.

Но сСйчас, ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ наш поиск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Whoosh. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ собираСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Flask-WhooshAlchemy, которая ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π±Π°Π·Ρƒ Whoosh с модСлью Flask-SQLAlchemy.

Если Ρƒ вас ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Flask-WhooshAlchemy Π² вашСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, самоС врСмя ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Windows Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ВсС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ³Ρƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρƒ Flask-WhooshAlchemy ΠΎΡ‡Π΅Π½ΡŒ простая. ΠœΡ‹ просто Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ имя нашСй Π±Π°Π·Ρ‹ для полнотСкстового поиска (Ρ„Π°ΠΉΠ» config.py ):

ИзмСнСния модСли

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Flask-WhooshAlchemy интСгрируСтся Flask-SQLAlchemy, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ проиндСксированы Π² ΠΊΠ°ΠΊΠΈΡ… модСлях (Ρ„Π°ΠΉΠ» app/models.py ):

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ мСняли Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ нашСй Π±Π°Π·Ρ‹, Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ.

К соТалСнию всС посты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π² Π±Π°Π·Π΅ Π΄ΠΎ добавлСния Π΄Π²ΠΈΠΆΠΊΠ° полнотСкстового поиска, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ проиндСксированы. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ поиска синхронизированы ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС посты ΠΈΠ· Π±Π°Π·Ρ‹ ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ сначала. Π‘Π½Π°Ρ‡Π°Π»Π° запускаСм ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python. Для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Windows:

Для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…:

Π­Ρ‚ΠΈΠΌ запросом ΠΌΡ‹ удаляСм всС посты:

Поиск

БСйчас ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ поиску. Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала Π΄ΠΎΠ±Π°Π²ΠΈΠΌ нСсколько постов Π² Π‘Π”. Π£ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° способа ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ посты Ρ‡Π΅Ρ€Π΅Π· web-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΈΠ»ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€.

Π§Π΅Ρ€Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Flask-WhooshAlchemy ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€ΡƒΡ‚ΠΎΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ соСдиняСтся с Flask-SQLAlchemy автоматичСски. Нам Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ индСкс полнотСкстового поиска, всС дСлаСтся ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ для нас.

БСйчас ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ нСсколько постов проиндСксированных для полнотСкстового поиска ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ:

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, запросы Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌΠΈ словами. По Ρ„Π°ΠΊΡ‚Ρƒ Whoosh ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ прСкрасный язык поисковых запросов.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ полнотСкстового поиска Π² нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ поиск доступным для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ нашСго прилоТСния ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ сколько Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ (Ρ„Π°ΠΉΠ» config.py ):

Π€ΠΎΡ€ΠΌΠ° поиска

ΠœΡ‹ собираСмся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ поиска Π² строку Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π²Π²Π΅Ρ€Ρ…Ρƒ страницы. РасполоТнСниС Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ поиск Π±ΡƒΠ΄Π΅Ρ‚ доступСн со всСх страниц.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ класс Ρ„ΠΎΡ€ΠΌΡ‹ поиска (Ρ„Π°ΠΉΠ» app/forms.py ):

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΠΎΡ€ΠΌΡƒ Π² наш шаблон(Ρ„Π°ΠΉΠ» app/templates/base.html ):

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΡƒ поиска Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вошСл Π² систСму. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ before_request создаст Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вошСл Π² систСму, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ΠΌ гостям.

View. Ѐункция Search

ПолС action для нашСй Ρ„ΠΎΡ€ΠΌΡ‹ Π±Ρ‹Π» установлСн Π²Ρ‹ΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ всС запросы Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ search нашСго прСдставлСния. Π­Ρ‚ΠΎ Ρ‚ΠΎ мСсто Π³Π΄Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ наши полнотСкстовыС запросы (Ρ„Π°ΠΉΠ» app/views.py ):

Π­Ρ‚Π° функция Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ такая ΡƒΠΆ ΠΈ большая, ΠΎΠ½Π° просто собираСт запрос ΠΈΠ· Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ пСрСнаправляСт Π΅Π³ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ страницу, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ запрос Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠœΡ‹ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ поиск Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ Π²Ρ‹Π΄Π°Π²Π°Π» ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ попытаСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ страницу. Π­Ρ‚ΠΎΠΉ ситуации ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ сдСлав Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚ Π½Π° POST-запрос, Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ страницы Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Ρ‚Ρƒ страницу, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±Ρ‹Π» Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚, Π° Π½Π΅ сам запрос.

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ строка запроса ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Ρ„ΠΎΡ€ΠΌΠΎΠΉ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ POST ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ search_results (Ρ„Π°ΠΉΠ» app/views.py ):

Ѐункция search_result отправляСт запрос Π² Whoosh, пСрСдавая вмСстС с запросом ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ количСству Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ большого количСства Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска.

Поиск Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π² шаблонС search_result (Ρ„Π°ΠΉΠ» app/templates/search_results.html ):

Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ слова

ΠœΡ‹ сСйчас Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ, хотя ΠΈ часто ΡƒΠΏΡƒΡΠΊΠ°Π΅ΠΌΡƒΡŽ ΠΈΠ· Π²ΠΈΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎΠ΅ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

НиТС я Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ прилоТСния microblog Π²ΠΎ всСми измСнСниями, сдСланными Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Как всСгда, Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Если Π²Ρ‹ слСдитС Π·Π° этой сСриСй статСй, Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Ρ‚ΡŒ. Если ΠΆΠ΅ Π½Π΅Ρ‚, Ρ‚ΠΎ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Как ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ полнотСкстовый поиск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Ρ… сСтСй

ΠŸΠΎΡ‡Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ полнотСкстового поиска слоТно ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ, Ссли хочСтся это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠœΡ‹ всС постоянно сталкиваСмся с Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ полнотСкстовым поиском β€” Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ поисковой Ρ„Ρ€Π°Π·Π΅. Π‘Π°ΠΌΡ‹ΠΉ извСстный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” это поиск Google.

БущСствуСт Π½Π΅ΠΌΠ°Π»ΠΎ инструмСнтов для построСния полнотСкстового поиска Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Достаточно популярным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Elasticsearch. На Π΅Π³ΠΎ основС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск ΠΏΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… с дСсятками ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ΠœΡ‹ Π² DD Planet Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ сСрвисы поиска ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΠΎ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… B2B-Π·Π°ΠΊΡƒΠΏΠΎΠΊ ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Elasticsearch. Но ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск ΠΈ сопоставлСниС ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ²), Ρ‚ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с рядом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ полнотСкстовый поиск

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ систСм полнотСкстового поиска, Π² Ρ‚ΠΎΠΌ числС ΠΈ Elasticsearch, основаны Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ индСксС β€” структурС Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова ΠΈΠ· Π±Π°Π·Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² хранятся всС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΎ встрСчаСтся. ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ индСкс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для поиска ΠΏΠΎ тСкстам.

ΠŸΡƒΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ корпус ΠΈΠ· Π±Π°Π·Ρ‹ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… тСкстов:

Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ индСкс Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Поиск ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ слову ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ β€” это просто список всСх Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… поисковому слову. ΠŸΡ€ΠΈ поискС Ρ„Ρ€Π°Π·Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ пСрСсСчСниС, Ρ‚Π°ΠΊ объСдинСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ словам с Ρ†Π΅Π»ΡŒΡŽ Ρ€Π°Π½ΠΆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎ рСлСвантности. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, поиск Ρ„Ρ€Π°Π·Ρ‹ «красная Ρ€ΡƒΡ‡ΠΊΠ°Β». Поиск ΠΏΠΎ слову «красный» Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ <2>, ΠΏΠΎ слову Β«Ρ€ΡƒΡ‡ΠΊΠ°Β» β€” <0>. ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ пусто, поэтому Ρ‚ΠΎΡ‡Π½ΠΎ совпадСния Π½Π΅Ρ‚. Если ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ частичноС совпадСниС, Ρ‚ΠΎ получится Π΄Π²Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° <0, 2>c ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ соотвСтствия Β½. Π’ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… поисковых систСмах ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ранТирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ TF-IDF, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π±Π΅Π· тСкстового совпадСния с поисковым запросом.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ полнотСкстового поиска

Если Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ просто ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π° ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ…, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ написанныС ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, Ρ‚ΠΎ ΠΌΡ‹ сталкиваСмся со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ:

NLP ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

Одним ΠΈΠ· Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… способов Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ NLP ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ². NLP (Natural Language Processing) β€” ΠΎΠ±Ρ‰Π΅Π΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ искусствСнного ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π° ΠΈ матСматичСской лингвистики, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ синтСза СстСствСнных языков.

NLP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСмантико-синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ тСкста, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ СстСствСнно-языковыС срСдства. БСйчас сущСствуСт мноТСство Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² ΠΈ ΡƒΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² этой области.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ «похоТСсти» Ρ„Ρ€Π°Π·

Π’ NLP Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Ρ‡Π° β€” Paraphrase Identification β€” это ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… тСкстовых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ) ΠΈ опрСдСлСния, ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΈ ΠΎΠ½ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°Ρ„Ρ€Π°Π·Π°ΠΌΠΈ). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ°Ρ€Π°Ρ„Ρ€Π°Π·: Β«Π—Π°Π²Ρ‚Ρ€Π° ΠΊΠ°Ρ„Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎ 17:00Β» ΠΈ «На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ дСнь ΠΊΠ°Ρ„Π΅Ρ‚Π΅Ρ€ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄ΠΎ пяти Π²Π΅Ρ‡Π΅Ρ€Π°Β». ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π½Π°ΠΌ интСрСсно? Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ парафразирования ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкстовыС описания Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² ΠΈ Π²Ρ‹ΡΡΠ½ΡΡ‚ΡŒ, связаны Π»ΠΈ ΠΎΠ½ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Ρ…ΠΎΡ€ΠΎΡˆΠΎ исслСдована. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ большиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°Ρ„Ρ€Π°Π· Π½Π° русском ΠΈ английском языках. Π’ качСствС инструмСнта для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ DeepPavlov.ai [1], ΠΌΠΎΡ‰Π½ΠΎΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌΡƒ Π² МЀВИ. Π’ Π½Π΅ΠΌ собраны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ, связанныС с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ русского языка.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π°Π·Ρ‹ ΠΏΠ°Ρ€Π°Ρ„Ρ€Π°Π·. Π’Π°ΠΊ ΠΊΠ°ΠΊ наша Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° достаточна спСцифична (поиск Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ²), Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° собствСнная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ воспользовались Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠ² Π²ΠΈΠ΄Π° ЯндСкс.ΠœΠ°Ρ€ΠΊΠ΅Ρ‚Π°. Взяли ΠΎΠ΄Π½ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€Π° с ΠœΠ°Ρ€ΠΊΠ΅Ρ‚Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ этого ΠΆΠ΅ Ρ‚ΠΎΠ²Π°Ρ€Π° Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅.

ЭкспСримСнтируя с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ модСлями, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π² DeepPavlov, ΠΌΡ‹ поняли β€” основной Π²ΠΊΠ»Π°Π΄ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄Π°ΡŽΡ‚ Π½Π΅ настройки ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π° качСство Π½Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….

Как ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск, ΠΊΠΎΠ³Π΄Π° Ρƒ нас ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅Ρ‚

Однако Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ просто ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ стСпСни соотвСтствия, Π° Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹. Как это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ поиска Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиски Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ индСкс Elasticsearch ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ поиска Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ скорости поиска.

Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ: мноТСство строк ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ соотвСтствия ΠΌΠ΅ΠΆΠ΄Ρƒ этими строками. Π‘ΡƒΠ΄Π΅ΠΌ Π΄Π°Π»Π΅Π΅ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ расстояниСм.

Если ΠΏΠΎΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‚ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру: мСтричСскоС пространство β€” это мноТСство, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поисктакая, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ аксиомы:

Π—Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° такая слоТная структура? Она Π½ΡƒΠΆΠ½Π° для эффСктивного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ поиска Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй (Nearest neighbor search) β€” Π² нашСм случаС поиска ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ². Вакая Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° Π² мСтричСском пространствС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры vantage-point tree, поиск Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ асимптотику поиска Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск[2]. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ссли Π±Ρ‹ Ρ€Π΅Ρ‡ΡŒ шла ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°Ρ…, эта Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠΈΠ»Π°ΡΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Kd-Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². Однако Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΠΎΠ»Π΅Π΅ абстрактны, всС Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС.

Vantage-point tree

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ vantage-point tree [3]. Оно Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ball-tree, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… пространствах. Π•Π³ΠΎ структура прСдставляСт собой Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ. Рассмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ строится. ΠœΡ‹ Π±Π΅Ρ€Π΅ΠΌ Π² качСствС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· мноТСства (vantage-point) ΠΈ рисуСм Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅Π³ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ (ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рисункС Π½ΠΈΠΆΠ΅).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, находящиСся Π²Π½ΡƒΡ‚Ρ€ΠΈ окруТности (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° расстоянии Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискот vantage-point), ΠΈΠ΄ΡƒΡ‚ Π² Π»Π΅Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²Π°. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ β€” Π² ΠΏΡ€Π°Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° повторяСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€Π΅Π²ΠΎ Π±Ρ‹Π»ΠΎ сбалансировано, Π½Π°Π΄ΠΎ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ S Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ исходноС мноТСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² дСлилось Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π²Π½Ρ‹Π΅ части. Π­Ρ‚ΠΎ нСслоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС расстояния ΠΈ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡ… ΠΌΠ΅Π΄ΠΈΠ°Π½Ρƒ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΉΡ‚ΠΈ K Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск(ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π° красным крСстиком Π½Π° рисункС). ΠœΡ‹ Π΅Ρ‰Π΅ Π½Π΅ нашли Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, поэтому Π² качСствС блиТайшСго ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π° Π±Π΅Ρ€Π΅ΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ Π΄Π΅Ρ€Π΅Π²Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠΌ эту Ρ‚ΠΎΡ‡ΠΊΡƒ). Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск— Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ расстояниС Π΄ΠΎ самого дальнСго ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Π΄ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡΡ… ΠΈΠ»ΠΈ достаточно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ Π½ΠΈΡ….

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ° Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискнаходится Π²Π½ΡƒΡ‚Ρ€ΠΈ нашСй окруТности, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Β«Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅Β» ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ. Находим Π² этом ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π΅ синюю Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈ обновляСм Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Надо Π»ΠΈ Π½Π°ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ «внСшнСС» ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ? ΠœΡ‹ рассмотрСли всС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ окруТности, Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискT$» data-tex=»inline»/> (расстояниС ΠΎΡ‚ X Π΄ΠΎ окруТности), Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ окруТности ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π—Π½Π°Ρ‡ΠΈΡ‚, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ «внСшнСС» ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Однако Ссли ΠΌΡ‹ ΡƒΠΆΠ΅ собрали K Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ, Π° Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ «внСшнСС» ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π½Π΅Ρ‚ нСобходимости. Π­Ρ‚ΠΎ ΠΈ обСспСчиваСт Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ.

ΠœΠ΅Ρ‚Ρ€ΠΈΡ‡Π΅ΡΠΊΠ°Ρ функция

ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ парафразирования Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискв качСствС расстояния для построСния vantage-point tree ΠΈ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с рядом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

НС выполняСтся пСрвая аксиома β€” расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹. Π­Ρ‚ΠΎ условиС Π½Π΅ выполняСтся ΡƒΠΆΠ΅ Π½Π° ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Ρ€Π°Π·Ρ‹ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΈΡ… Ρ€Π°Π·Π½ΠΎΠΌ написании. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ основному Ρ€Π°ΡΡΡ‚ΠΎΡΠ½ΠΈΡŽ cosine расстояниС ΠΏΠΎ Doc2Vec с нСбольшим вСсом β€” ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Однако вопрос ΠΏΠΎΠ΄Π±ΠΎΡ€Π° вСсового коэффициСнта Ξ΅ остаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ β€” с этим Π½Π°Π΄ΠΎ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

МодСль нСсиммСтрична. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠΎΠ½ΡΡ‚ΡŒ это достаточно слоТно, Π½ΠΎ, скорСС всСго, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² ошибкС округлСния float32. Из-Π·Π° слоТности ΠΌΠΎΠ΄Π΅Π»ΠΈ ошибка накапливаСтся Π² слоях Π½Π΅ΠΉΡ€ΠΎΠ½ΠΎΠ². Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ вычислСниСм сначала расстояния ΠΎΡ‚ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискдо Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΈ суммированиСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

НС всСгда выполняСтся нСравСнство Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этого ΡΠ²Π»ΡΡŽΡ‚ΡΡ особСнности обучСния нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ парафразирования. НапримСр, рассмотрим Ρ„Ρ€Π°Π·Ρ‹

Π­Ρ‚ΠΎ наглядный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискИз-Π·Π° этого поисковая Π²Ρ‹Π΄Π°Ρ‡Π° ΠΈΠ½ΠΎΠ³Π΄Π° получаСтся нСупорядочСнной. Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ аналитичСски это Π½Π΅ получаСтся, Π½ΠΎ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ вСса расстояния Doc2Vec β€” для Π½Π΅Π³ΠΎ нСравСнство Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° выполняСтся всСгда.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ, описанныС Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ β€” врСмя поиска росло Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ, Π° Π½Π΅ логарифмичСски, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ. Покопавшись Π² Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅, ΠΌΡ‹ выяснили: логарифмичСская ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ поиска ΠΈΠΌΠ΅Π΅Ρ‚ мСсто для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ распрСдСлСния Ρ‚ΠΎΡ‡Π΅ΠΊ Π² пространствС [2]. А Ρƒ нас ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ распрСдСлСны Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ β€” ΠΎΠ½ΠΈ Ρ‡Π°Ρ‰Π΅ дальшС, Ρ‡Π΅ΠΌ Π±Π»ΠΈΠΆΠ΅.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ идСя. ΠŸΠΎΡΡ‡ΠΈΡ‚Π°Π΅ΠΌ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹ расстояний ΠΈ нанСсСм ΠΈΡ… Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊ (Π½Π° рисункС слСва). Если ΠΌΡ‹ растянСм Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°, Π° ниТнюю соТмСм, Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ распрСдСлСны ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ (ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС справа). Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ порядок Π² мноТСствС расстояний ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ прСобразования Π½Π΅ измСнится. МоТно ΠΏΡ€ΠΈ нСобходимости ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ количСство ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ «идСальноС» распрСдСлСниС расстояний.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Π˜Ρ‚ΠΎΠ³ΠΈ

Пока Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΈ тСстированиС Π½Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (Π΄ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²), ΠΈ Ρ‚Π°ΠΌ наш поиск Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ВрСмя сборки Π΄Π΅Ρ€Π΅Π²Π° растСт практичСски Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ с нСбольшим логарифмичСским коэффициСнтом.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Рост Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ поиска Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊ логарифмичСскому. ΠŸΠΎΡ‡Π΅ΠΌΡƒ рост Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ поиска Π½Π΅ всСгда Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π΅Π½? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° поиска зависит ΠΎΡ‚ распрСдСлСния Ρ‚ΠΎΡ‡Π΅ΠΊ Π² пространствС. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ интСрСсный вопрос: Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ распрСдСлСниСм Ρ‚ΠΎΡ‡Π΅ΠΊ Π² пространствС, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠ΅ распрСдСлСниС Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ? Π’ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΏΠΎ vantage-point tree этот вопрос ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ обсуТдаСтся, Π½ΠΎ обсуТдаСтся смСТный вопрос β€” ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ vantage-point.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

НапримСр, Π² мСтричСском пространствС Π½ΡƒΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ΡΠ°ΠΌΡƒΡŽ ΠΊΡ€Π°ΠΉΠ½ΡŽΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ[2], Ρ‚ΠΎΠ³Π΄Π° Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ мСньшС всСго Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ поиск станСт Π»ΡƒΡ‡ΡˆΠ΅. Но эта идСя Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² пространствС с понятиями Π»Π΅Π²ΠΎ, ΠΏΡ€Π°Π²ΠΎ ΠΈ ΠΊΡ€Π°ΠΉ. Π’ пространствС Π±Π΅Π· порядка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² эта идСя Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

НашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ являСтся «сСрСбряной ΠΏΡƒΠ»Π΅ΠΉΒ». ΠœΡ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ для поиска Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ², ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ. Если Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

МСга-Π£Ρ‡Π΅Π±Π½ΠΈΠΊ Flask, Π§Π°ΡΡ‚ΡŒ XVI: ΠŸΠΎΠ»Π½ΠΎΡ‚Π΅ΠΊΡΡ‚ΠΎΠ²Ρ‹ΠΉ поиск

(ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ 2018)

Miguel Grinberg

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискВуда Бюда Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Π­Ρ‚ΠΎ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ сСрии МСга-ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠΎΠ² Flask, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΌΠΈΠΊΡ€ΠΎΠ±Π»ΠΎΠ³ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ полнотСкстового поиска.

Под спойлСром ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ список всСх статСй этой сСрии 2018 Π³ΠΎΠ΄Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 1: Если Π²Ρ‹ ΠΈΡ‰Π΅Ρ‚Π΅ старыС вСрсии Π΄Π°Π½Π½ΠΎΠ³ΠΎ курса, это здСсь.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 2: Если Π²Π΄Ρ€ΡƒΠ³ Π’Ρ‹ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π²Ρ‹ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠΎΠ΅ΠΉ(МигСля) Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈΠ»ΠΈ просто Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ тСрпСния Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ ΡΡ‚Π°Ρ‚ΡŒΠΈ нСдСлю, я (МигСль Π“Ρ€ΠΈΠ½Π±Π΅Ρ€Π³)ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΠΎΠ»Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства(Π½Π° английском языкС) Π² Π²ΠΈΠ΄Π΅ элСктронной ΠΊΠ½ΠΈΠ³ΠΈ ΠΈΠ»ΠΈ Π²ΠΈΠ΄Π΅ΠΎ. Для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ посСтитС learn.miguelgrinberg.com.

ЦСль этой Π³Π»Π°Π²Ρ‹ β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ поиска для Microblog, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ интСрСсныС сообщСния с использованиСм ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ языка. Для ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π²Π΅Π±-сайтов ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Google, Bing ΠΈ Ρ‚. Π΄. Π˜Π½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска Ρ‡Π΅Ρ€Π΅Π· свои API поиска. Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для сайтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π² основном статичСскиС страницы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΠΎΡ€ΡƒΠΌ. Но Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ основной Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° являСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ пост, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ всСй Π²Π΅Π±-страницы. Поиск, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ΅Π½, относится ΠΊ этим ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ сообщСниям Π² Π±Π»ΠΎΠ³Π΅, Π° Π½Π΅ Ρ†Π΅Π»Ρ‹ΠΌ страницам. НапримСр, Ссли я ΠΈΡ‰Ρƒ слово «собака», Ρ‚ΠΎ Ρ…ΠΎΡ‡Ρƒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ это слово Π² Π±Π»ΠΎΠ³Π°Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ страница, которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС сообщСния, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ слово «собака» (ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ поиска), Π½Π΅ сущСствуСт ΠΊΠ°ΠΊ страница Π² Π±Π»ΠΎΠ³Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ большиС поисковыС систСмы, поэтому Ρƒ мСня Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π°, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΡΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ поиска.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² полнотСкстовыС поисковыС систСмы

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° полнотСкстового поиска Π½Π΅ стандартизирована, ΠΊΠ°ΠΊ рСляционныС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. БущСствуСт нСсколько полнотСкстовых Π΄Π²ΠΈΠΆΠΊΠΎΠ² с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ: Elasticsearch, Apache Solr, Whoosh, Xapian, Sphinx ΠΈ Ρ‚.Π΄. Как Π±ΡƒΠ΄Ρ‚ΠΎ этого нСдостаточно! Π•ΡΡ‚ΡŒ нСсколько Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ возмоТности поиска, сравнимыС с Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ поисковыми систСмами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я пСрСчислил Π²Ρ‹ΡˆΠ΅. SQLite, MySQL ΠΈ PostgreSQL ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для поиска тСкста, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… NoSQL, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ MongoDB ΠΈ CouchDB.

Если Π²Π°ΠΌ интСрСсно, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Flask, ΠΎΡ‚Π²Π΅Ρ‚ β€” всС ΠΎΠ½ΠΈ! Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… сторон Flask, ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π½Π΅ упрямится. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€?

По ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, ΠΈΠ· списка спСциализированных поисковых систСм Elasticsearch β€” особСнно выдСляСтся. И ΠΊΠ°ΠΊ самый популярный, ΠΈ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ стоит ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² качСствС символа Β«EΒ» Π² стСкС ELK для индСксирования Π»ΠΎΠ³ΠΎΠ², совмСстно с Logstash ΠΈ Kibana. ИспользованиС возмоТностСй поиска Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ, Π½ΠΎ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ SQLAlchemy Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ поиск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… SQL-инструкций ΠΈΠ»ΠΈ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ с доступом ΠΊ тСкстовым запросам, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ совмСстного использования с SQLAlchemy.

ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π²Ρ‹ΡˆΠ΅ сказанном, я Π²Ρ‹Π±ΠΈΡ€Π°ΡŽ Elasticsearch, Π½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ индСксирования тСкста ΠΈ поиска Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ мою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ вСрсиСй Π½Π° основС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, просто пСрСписав нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅.

ПослС установки Elasticsearch Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΎΠ½, ввСдя http://localhost:9200 Π² адрСсной строкС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сСрвисС Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Elasticsearch Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ· Python, я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Python:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» requirements.txt:

Elasticsearch Tutorial

Для Π½Π°Ρ‡Π°Π»Π° я ΠΏΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ основы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Elasticsearch ΠΈΠ· ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Python. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с этим сСрвисом ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я расскаТу ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ index ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΈ Π² этом случаС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ doc_type ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн Π² Ρ€Π°Π·Π½Ρ‹Π΅ значСния Π² соотвСтствии с этими Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ. Π― ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, поэтому я ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽ Ρ‚ΠΈΠΏ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½ΠΈ индСкса.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сохранСнного Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Elasticsearch ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сохраним Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ этому ΠΆΠ΅ индСксу:

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π² этом индСксС Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, я ΠΌΠΎΠ³Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск Π² свободной Ρ„ΠΎΡ€ΠΌΠ΅. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΊΠ°Ρ‚ΡŒ this test :

ΠžΡ‚Π²Π΅Ρ‚ es.search() прСдставляСт собой ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Python с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ поиска:

Π—Π΄Π΅ΡΡŒ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ поиск Π²Π΅Ρ€Π½ΡƒΠ» Π΄Π²Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ со своСй ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с большСй ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ содСрТит Π΄Π²Π° слова, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я искал, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ. Но, ΠΊΠ°ΠΊ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π΄Π°ΠΆΠ΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ большой Π±Π°Π»Π», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ слова Π½Π΅ совсСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ тСксту.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для поиска слова second :

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Π°Ρ ΠΎΡ†Π΅Π½ΠΊΠ° довольно низкая, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΉ поиск Π½Π΅ соотвСтствуСт тСксту Π² этом Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² содСрТит слово «second», Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ отобраТаСтся.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ запроса Elasticsearch ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ всС ΠΎΠ½ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Π‘Ρ€Π΅Π΄ΠΈ Π½ΠΈΡ… Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π° страницы ΠΈ сортировка, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² случаС рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ большС записСй Π² этот индСкс ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ поиска. Когда Π²Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚Π΅ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ индСкс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Elasticsearch

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Elasticsearch Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ крутости Flask. Π­Ρ‚ΠΎΡ‚ сСрвис ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ с Flask, Π½ΠΎ я всС ΠΆΠ΅ ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ. Начну с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Ρƒ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² словарС app.config для Flask:

app/init.py: Elasticsearch instance.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ None экзСмпляру Elasticsearch, Ссли URL-адрСс слуТбы Elasticsearch Π½Π΅ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² срСдС.

Абстракция Full-Text Search

Как я сказал Π²ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊ Π³Π»Π°Π²Π΅, я Ρ…ΠΎΡ‡Ρƒ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ Elasticsearch ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ поисковым систСмам. И я Π½Π΅ Ρ…ΠΎΡ‡Ρƒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для поиска сообщСний Π² Π±Π»ΠΎΠ³Π΅, Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ я ΠΌΠΎΠ³Ρƒ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ссли ΠΌΠ½Π΅ это понадобится. По всСм этим ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, я Ρ€Π΅ΡˆΠΈΠ» ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска. ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ…, поэтому я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ модСль Post являСтся СдинствСнной, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ проиндСксирована, ΠΈ я Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Elasticsearch являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ индСкс-Π΄Π²ΠΈΠΆΠΊΠΎΠΌ. Но Ссли я Π½Π΅ ΠΌΠΎΠ³Ρƒ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½ΠΈ ΠΎ Ρ‡Π΅ΠΌ, ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ?

app/models.py: Add a __searchable__ attribute to the Post model.

Π― ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ взаимодСйствуСт с индСксом Elasticsearch Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ app/search.py. ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ вСсь ΠΊΠΎΠ΄ Elasticsearch Π² этом ΠΌΠΎΠ΄ΡƒΠ»Π΅. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этом Π½ΠΎΠ²ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ для доступа ΠΊ индСксу ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ прямого доступа ΠΊ Elasticsearch. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ я Ρ€Π΅ΡˆΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ большС Π½Π΅ нравится Elasticsearch ΠΈ ΡΠΎΠ±Π΅Ρ€ΡƒΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ, всС, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этом ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ.

Для этого прилоТСния я Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ€ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, связанныС с индСксированиСм тСкста: ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ:

Π’ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ app/search.py, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ эти Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Elasticsearch, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я ΠΏΠΎΠΊΠ°Π·Π°Π» Π²Π°ΠΌ Π²Ρ‹ΡˆΠ΅ с консоли Python:

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя index. Π’ΠΎ всСх Π²Ρ‹Π·ΠΎΠ²Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ Elasticsearch, я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ это имя Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ индСкса, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² качСствС Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠ°ΠΊ я ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π» это Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… консоли Python.

Π­Ρ‚ΠΎ слишком Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎ? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, дСмонстрация этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² консоли Python ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ сСансС я Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ добавляю всС сообщСния ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² индСкс Elasticsearch. Π’ ΠΌΠΎΠ΅ΠΉ тСстовой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρƒ мСня Π±Ρ‹Π»ΠΎ нСсколько сообщСний, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ «one», «two», «three», «four» ΠΈ Β«ΠΏΡΡ‚ΡŒΒ», поэтому я использовал ΠΈΡ… Π² поисковых запросах. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ придСтся Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой запрос для соотвСтствия содСрТимому вашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

Запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ», Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сСмь Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ я запросил 1 страницу со 100 ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌΠΈ Π½Π° страницу ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» всС сСмь Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ…. Π—Π°Ρ‚Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ страницы способом ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ, Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ я это сдСлал для Flask-SQLAlchemy, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ приходят Π² Π²ΠΈΠ΄Π΅ списка ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² вмСсто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² SQLAlchemy.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС Π² чистотС, ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ индСкс posts послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ΡΡŒ с Π½ΠΈΠΌ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ поиска с SQLAlchemy

РСшСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я ΠΏΠΎΠΊΠ°Π·Π°Π» Π²Π°ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ΅, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ нСсколько Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ очСвидная Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ приходят Π² Π²ΠΈΠ΄Π΅ списка числовых ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ SQLAlchemy, Ρ‡Ρ‚ΠΎΠ±Ρ‹ я ΠΌΠΎΠ³ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ΅Π½ способ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот список чисСл ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ модСлями ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Вторая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ явной Π²Ρ‹Π΄Π°Π²Π°Π»ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ индСксирования. БообщСния Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ, Π½ΠΎ Π½Π΅ идСально, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ошибка, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ индСксации Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π° сторонС SQLAlchemy Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹. Π”Π²Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ всС большС ΠΈ большС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки ΠΈ Π²Ρ‹, вСроятно это Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎΠ΅ Ρ‚ΠΎ врСмя. Π›ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ автоматичСскоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… SQLAlchemy.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° ΠΏΡƒΡ‚Π΅ΠΌ создания запроса SQLAlchemy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ просто, Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эффСктивноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ‚Π°ΠΊ Ρ‚ΠΎ просто.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ (автоматичСского отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ индСксирования) я Ρ€Π΅ΡˆΠΈΠ» Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ обновлСния индСкса Elasticsearch ΠΈΠ· events (событий) SQLAlchemy. SQLAlchemy прСдоставляСт большой список событий, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния. НапримСр, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ commit-Π° (фиксации ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ) сСанса, я ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ SQLAlchemy, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ обновлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ сдСланы Π² сСансС SQLAlchemy ΠΊ индСксу Elasticsearch.

ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ я Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ интСрСсныС Π΄Π΅Ρ‚Π°Π»ΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ before_commit() ΠΈ after_commit() Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π΄Π²Π° события ΠΈΠ· SQLAlchemy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π΄ΠΎ ΠΈ послС фиксации соотвСтствСнно. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ before ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сСанс Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» зафиксирован, поэтому я ΠΌΠΎΠ³Ρƒ глянув Π½Π° Π½Π΅Π³ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹, доступны ΠΊΠ°ΠΊ session.new session.dirty ΠΈ session.deleted соотвСтствСнно. Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ большС Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны послС фиксации сСанса, поэтому ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π΄ΠΎ фиксации. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ session._changes ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для записи этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² мСстС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π΅Ρ‚ всС фиксации сСанса, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСанс пофиксится я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для обновлСния индСкса Elasticsearch.

ΠœΠ΅Ρ‚ΠΎΠ΄ класса reindex() β€” это простой Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обновлСния индСкса со всСми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· рСляционной стороны. Π’Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ я Π΄Π΅Π»Π°Π» Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΈΠ· сСанса ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Python Π²Ρ‹ΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ всСх сообщСний Π² тСстовый индСкс. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, я ΠΌΠΎΠ³Ρƒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Post.reindex(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ всС записи Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² индСкс поиска (search index).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ db.event.listen() Π½Π΅ входят Π² класс, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ послС Π½Π΅Π³ΠΎ. Они ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ before ΠΈ after для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ фиксации. Π’Π΅ΠΏΠ΅Ρ€ΡŒ модСль Post автоматичСски ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ индСкс полнотСкстового поиска для сообщСний.

app/models.py: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ SearchableMixin class Π² Post model.

Π― ΠΌΠΎΠ³Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ reindex() для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ индСкса ΠΈΠ· всСх сообщСний, находящихся Π² настоящСС врСмя Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…:

Π€ΠΎΡ€ΠΌΠ° поиска

ΠŸΡ€ΠΎΠ΄Π΅Π»Π°Π½Π° достаточно напряТСнная Ρ€Π°Π±ΠΎΡ‚Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π°ΠΌ потрСбуСтся врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ. Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ мСня Π΅ΡΡ‚ΡŒ закончСнная систСма для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с поиском Π½Π° Ρ€ΠΎΠ΄Π½ΠΎΠΌ языкС любого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для сообщСний Π² Π±Π»ΠΎΠ³Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Достаточно стандартный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для Π²Π΅Π±-поиска Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ строка поиска Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π°, ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ q Π² строкС запроса URL-адрСса. НапримСр, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Python Π² Google, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ сСкунд, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ввСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ URL-адрСс Π² адрСсной строкС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ нСпосрСдствСнно ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ:

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ поиску Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ инкапсулированным Π² URL-адрСс ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ людьми, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто Π½Π°ΠΆΠ°Π² Π½Π° ссылку ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ доступ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ поиска.

Π’ΠΎΡ‚ класс Ρ„ΠΎΡ€ΠΌΡ‹ поиска, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с тСкстовым ΠΏΠΎΠ»Π΅ΠΌ q :

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта Ρ„ΠΎΡ€ΠΌΠ° Π±Ρ‹Π»Π° Π²ΠΈΠ΄Π½Π° Π½Π° всСх страницах, ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр класса SearchForm нСзависимо ΠΎΡ‚ страницы, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ просматриваСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. ЕдинствСнноС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вошСл Π² систСму, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ для Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ я ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π΅ (route), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ всСм шаблонам (templates), я ΠΏΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ Ρ‚Ρ€ΡŽΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устраняСт Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²ΠΎ всСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π― ΡƒΠΆΠ΅ использовал ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ before_request Ρ€Π°Π½ΡŒΡˆΠ΅, Π΅Ρ‰Π΅ Π² Π³Π»Π°Π²Π΅ 6, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ врСмя послСднСго посСщСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ΠΎ, Ρ‡Ρ‚ΠΎ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свою Ρ„ΠΎΡ€ΠΌΡƒ поиска Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ с изюминкой:

app/main/routes.py: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ поиска Π² before_request handler.

app/templates/base.html: ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ поиска Π² ΠΏΠ°Π½Π΅Π»ΠΈ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ.

Ѐункция поиска Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ просмотра

ПослСдний Π±ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска-это функция прСдставлСния, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ прСдставлСниС Ρ„ΠΎΡ€ΠΌΡ‹ поиска. Π­Ρ‚Π° view β€” функция Π±ΡƒΠ΄Π΅Ρ‚ присоСдинСна ΠΊ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ /search, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос Π½Π° поиск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ http://localhost:5000/search?q=search-words, ΠΊΠ°ΠΊ ΠΈ Google.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ страница Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ ссылки Π½Π° страницы Π±ΡƒΠ΄ΡƒΡ‚ вычислСны, всС, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ-это ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ шаблон со всСми этими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π― ΠΌΠΎΠ³ Π±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ способ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ index.html шаблон для отобраТСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска, Π½ΠΎ учитывая, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСсколько ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ, я Ρ€Π΅ΡˆΠΈΠ» ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ search.html шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для отобраТСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска, воспользовавшись _post.html sub-шаблон для отобраТСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска:

app/templates/search.html: Π¨Π°Π±Π»ΠΎΠ½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска.

Π›ΠΎΠ³ΠΈΠΊΠ° отрисовки ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ссылок выглядит слСгка Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΠΉ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ докумСнтация Bootstrap для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° разбиСния Π½Π° страницы.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поискВуда Бюда Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ полнотСкстовый поиск

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *