Многократное совпадение столбцов в FTS3
У меня есть простая база данных из трех столбцов: заголовок, данные, информация. Я храню их в базе данных SQLite FTS3, чтобы я мог легко выполнять полнотекстовый поиск. Я основывал свое приложение на примере Словаря с возможностью поиска из Android. Одна вещь, которую я не могу понять, как это сделать, это как искать (сопоставлять) по двум столбцам. Я в основном хочу взять запрос и искать его в заголовке и столбцах данных. Ниже приведен метод, который готовит запрос:
public Cursor searchMatches(String query, String[] columns) {
String selection = KEY_TITLE + " MATCH ?";
String[] selectionArguements = new String[] {query + "*"};
return query(selection, selectionArguements, columns);
}
Если я не буду следовать этому точному формату KEY_TITLE + " MATCH ?"
для выбора ничего не будет работать, несмотря на то, что в документе FTS3 говорится, что могут работать другие способы. Как настроить этот выбор в Android для поиска по двум столбцам? Я пытался добавить OR
но я просто получаю ошибку логики SQL. Большое спасибо!
3 ответа
Хорошо, я нашел работоспособное решение, хотя оно не самое красивое. Это предполагает использование UNION
просто объединить два MATCH
запросы.
String wordQuery = builder.buildQuery(null, KEY_WORD + " MATCH '" + query + "*'", null, null, null, null, null);
String definitionQuery = builder.buildQuery(null, KEY_DEFINITION + " MATCH '" + query + "*'", null, null, null, null, null);
String unionQuery = builder.buildUnionQuery(new String[] {wordQuery, definitionQuery}, null, null);
Cursor result = helper.getReadableDatabase().rawQuery(unionQuery, null);
Вот как я это делаю
select * from table_name where table_name match 'YOURSEARCHSTRING'
Вам нужно написать свою собственную функцию запроса. Вы хотите, чтобы ваш запрос выглядел примерно так:
select * from table_name where title equals ? or info equals ?
Вы не можете просто добавить или к равной части утверждения (распространенная ошибка).