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

рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЦреЛрдЬ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг
- рдбреЗрдЯрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрдЬреЗрдВ
рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЗ рдКрдкрд░ рдПрдХ рдЦреЛрдЬ рдкрдЯреНрдЯреА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВред - рд╕рд░реНрд╡рд░ рдЦреЛрдЬ
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рдкрддрд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реА рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред - рдПрдХреАрдХреГрдд рдЦреЛрдЬ
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рд╣реЛрддреА рд╣реИ;
- рдЖрд╡реЗрджрди рдСрдлрд╝рд▓рд╛рдЗрди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдиреБрднрд╛рдЧреЛрдВ / рд╕рд╛рдордЧреНрд░реА рддрдХ рдПрдХрд▓ рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, SQLite рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдорд┐рд▓рд╛рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд┐рднрд┐рдиреНрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рд╢реНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реА рдЦреЛрдЬ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдбреЗрдЯрд╛ рдХреА рддреИрдпрд╛рд░реА
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ
themoviedb.org рд╕реЗ рдлрд┐рд▓реНрдореЛрдВ рдХреА рд╕реВрдЪреА
рджрд┐рдЦрд╛рддрд╛ рд╣реИ ред рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рддрд╛рдХрд┐ рдСрдирд▓рд╛рдЗрди рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ), рдлрд┐рд▓реНрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ JSON рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЖрдмрд╛рдж рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг JSON рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛:
[ { "id": 278, "title": " ", "overview": " ..." }, { "id": 238, "title": " ", "overview": " , ..." }, { "id": 424, "title": " ", "overview": " ..." } ]
рдбреЗрдЯрд╛рдмреЗрд╕ рднрд░рдирд╛
SQLite рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ, рд╡реЗ рдирд┐рдпрдорд┐рдд SQLite рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдкрд╣реБрдБрдЪ рдХреБрдЫ рдмреИрдХрд╕реНрдЯреЗрдЬ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рд╣рдореЗрдВ рдЦреЛрдЬ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдлрд╛рдпрджреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ:
- рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ;
- рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП ALTER TABLE рдФрд░ ADD COLUMN рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
- рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХреЙрд▓рдо рдкрд░ рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЦреЛрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмрд╛рдж рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдПрдХ рдЖрднрд╛рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред
рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛ рдорд╛рдирдХ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреАрд╡рд░реНрдб рдФрд░
fts4
:
CREATE VIRTUAL TABLE movies USING fts4(id, title, overview);
Fts5 рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА SQLite рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реИ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди Android рдХреЗ рдмрдбрд╝реЗ рд╡рд┐рдЦрдВрдбрди рдХреЗ рдХрд╛рд░рдг, рд╣рдо рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ fts5 (API24 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕рдорд░реНрдерди рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред рд╣рдордиреЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЬрд╛рдирд╛ рдФрд░ fts4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИред
рднрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ:
fun populate(context: Context) { val movies: MutableList<Movie> = mutableListOf() context.assets.open("movies.json").use { val typeToken = object : TypeToken<List<Movie>>() {}.type movies.addAll(Gson().fromJson(InputStreamReader(it), typeToken)) } try { writableDatabase.beginTransaction() movies.forEach { movie -> val values = ContentValues().apply { put("id", movie.id) put("title", movie.title) put("overview", movie.overview) } writableDatabase.insert("movies", null, values) } writableDatabase.setTransactionSuccessful() } finally { writableDatabase.endTransaction() } }
рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг
рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп,
MATCH
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ
LIKE
рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
fun firstSearch(searchString: String): List<Movie> { val query = "SELECT * FROM movies WHERE movies MATCH '$searchString'" val cursor = readableDatabase.rawQuery(query, null) val result = mutableListOf<Movie>() cursor?.use { if (!cursor.moveToFirst()) return result while (!cursor.isAfterLast) { val id = cursor.getInt("id") val title = cursor.getString("title") val overview = cursor.getString("overview") result.add(Movie(id, title, overview)) cursor.moveToNext() } } return result }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд╛рда рдЗрдирдкреБрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
RxJava
рдЙрдкрдпреЛрдЧ
RxJava
:
RxTextView.afterTextChangeEvents(findViewById(R.id.editText)) .debounce(500, TimeUnit.MILLISECONDS) .map { it.editable().toString() } .filter { it.isNotEmpty() && it.length > 2 } .map(dbHelper::firstSearch) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(movieAdapter::updateMovies)
рдкрд░рд┐рдгрд╛рдо рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЦреЛрдЬ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдкрд╣рд▓реЗ рддрддреНрд╡ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╢рдмреНрдж рд╡рд░реНрдгрди рдореЗрдВ рдФрд░ рджреВрд╕рд░реЗ рддрддреНрд╡ рдореЗрдВ рд╢реАрд░реНрд╖рдХ рдФрд░ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рд░реВрдк рдореЗрдВ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рдкрд╛рдпрд╛ред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред
рдЙрдЪреНрдЪрд╛рд░рдг рдЬреЛрдбрд╝реЗрдВ
рдЦреЛрдЬ рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди
SNIPPET
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рдкрд╛рда рдЦрдВрдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдорд┐рд▓рд╛рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
snippet(movies, '<b>', '</b>', '...', 1, 15)
- рдлрд┐рд▓реНрдореЗрдВ - рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо;
- <b & gt; рдФрд░ </ b> - рдЗрди рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдкрд╛рда рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рдерд╛;
- ... - рдкрд╛рда рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЕрдкреВрд░реНрдг рдореВрд▓реНрдп рдерд╛;
- 1 - рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╕реНрддрдВрдн рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкрд╛рда рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ;
- 15 рд▓реМрдЯреЗ рдкрд╛рда рдорд╛рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдХреЛрдб рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЕрдиреБрд░реЛрдз рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ:
SELECT id, snippet(movies, '<b>', '</b>', '...', 1, 15) title, snippet(movies, '<b>', '</b>', '...', 2, 15) overview FROM movies WHERE movies MATCH ''
рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдХрд▓рд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдВрдд рдирд╣реАрдВ рд╣реИред рдЪрд▓реЛ рд╣рдорд╛рд░реА рдЦреЛрдЬ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ "рдкреВрд░реНрдг" рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реА рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВрдЧреЗред
рд╕реБрдзрд╛рд░ рдЦрддреНрдо рдХрд░реЛ
SQLite рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреЛрдХрди рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдореВрд▓ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╕рдордп рд╣рдордиреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЛрдХрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ "рд╕рд░рд▓" рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдЪрд▓реЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдардиреАрдп рд╡рд░реНрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдХрд╛рдлреА рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЦреЛрдЬ рдореЗрдВ рдЧреБрдгрд╛рддреНрдордХ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
рд╕реНрдЯреЗрдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрдж рдХрд╛ рдЖрдзрд╛рд░ рдЦреЛрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ред
SQLite рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреЛрдХрди рд╣реИ рдЬреЛ рдкреЛрд░реНрдЯрд░ рд╕реНрдЯреАрдорд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЕрдВрдд рдФрд░ рдкреНрд░рддреНрдпрдпреЛрдВ рдХреЛ рдХрд╛рдЯрдХрд░ рдХрд┐рд╕реА рд╢рдмреНрдж рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдХреБрдВрдЬреА" рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдХ рдЦреЛрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╢рдмреНрдж "рдХреБрдВрдЬреА", "рдХреБрдВрдЬреА" рдФрд░ "рдХреБрдВрдЬреА" рдирд┐рд╣рд┐рдд рд╣реИрдВред рдореИрдВ рдЕрдВрдд рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, SQLite рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЯреЛрдХрди рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдШрдЯрдирд╛рдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рд╛рдЗрдЯ рд╕реЗ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓реЗ рд▓реЗрдВрдЧреЗред
рд╣рдо рдЕрдкрдиреА рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:
- рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдг рдирд┐рдХрд╛рд▓реЗрдВред
- рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рд╢рдмреНрджреЛрдВ рдореЗрдВ рддреЛрдбрд╝реЛред
- рддрдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫреЛрдбрд╝реЗрдВред
- рдПрдХ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред
рдкреЛрд░реНрдЯрд░ рдПрд▓рдЧреЛрд░рд┐рджрдо object Porter { private val PERFECTIVEGROUND = Pattern.compile("((|||||)|((<=[])(||)))$") private val REFLEXIVE = Pattern.compile("([])$") private val ADJECTIVE = Pattern.compile("(|||||||||||||||||||||||||)$") private val PARTICIPLE = Pattern.compile("((||)|((?<=[])(||||)))$") private val VERB = Pattern.compile("((||||||||||||||||||||||||||||)|((?<=[])(||||||||||||||||)))$") private val NOUN = Pattern.compile("(|||||||||||||||||||||||||||||||||||)$") private val RVRE = Pattern.compile("^(.*?[])(.*)$") private val DERIVATIONAL = Pattern.compile(".*[^]+[].*?$") private val DER = Pattern.compile("?$") private val SUPERLATIVE = Pattern.compile("(|)$") private val I = Pattern.compile("$") private val P = Pattern.compile("$") private val NN = Pattern.compile("$") fun stem(words: String): String { var word = words word = word.toLowerCase() word = word.replace('', '') val m = RVRE.matcher(word) if (m.matches()) { val pre = m.group(1) var rv = m.group(2) var temp = PERFECTIVEGROUND.matcher(rv).replaceFirst("") if (temp == rv) { rv = REFLEXIVE.matcher(rv).replaceFirst("") temp = ADJECTIVE.matcher(rv).replaceFirst("") if (temp != rv) { rv = temp rv = PARTICIPLE.matcher(rv).replaceFirst("") } else { temp = VERB.matcher(rv).replaceFirst("") if (temp == rv) { rv = NOUN.matcher(rv).replaceFirst("") } else { rv = temp } } } else { rv = temp } rv = I.matcher(rv).replaceFirst("") if (DERIVATIONAL.matcher(rv).matches()) { rv = DER.matcher(rv).replaceFirst("") } temp = P.matcher(rv).replaceFirst("") if (temp == rv) { rv = SUPERLATIVE.matcher(rv).replaceFirst("") rv = NN.matcher(rv).replaceFirst("") } else { rv = temp } word = pre + rv } return word } }
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬрд╣рд╛рдВ рд╣рдо рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рд╢рдмреНрджреЛрдВ рдореЗрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВ val words = searchString .replace("\"(\\[\"]|.*)?\"".toRegex(), " ") .split("[^\\p{Alpha}]+".toRegex()) .filter { it.isNotBlank() } .map(Porter::stem) .filter { it.length > 2 } .joinToString(separator = " OR ", transform = { "$it*" })
рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж, "рдкреНрд░рд╛рдВрдЧрдг рдФрд░ рднреВрдд" рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдпрд╛рд░реНрдб
* рдпрд╛ рднреВрдд
* " рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдкреНрд░рддреАрдХ "
* " рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЦреЛрдЬ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╢рдмреНрдж рдХреА рдШрдЯрдирд╛ рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред "
OR " рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЦреЛрдЬ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╢рдмреНрдж рд╣реЛрддрд╛ рд╣реИред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:

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