Используя SQLite FTS3, как объединять или вкладывать операторы SELECT, чтобы получить строку плюс фрагмент?
У меня есть виртуальная таблица SQLite FTS3 под названием categories
с колоннами category, id, header, content
, Я хочу найти его, и чтобы результаты содержали как данные столбца, так и snippet()
результат.
Последнее желаемое поведение - отображать категорию и идентификатор для каждого соответствия поискового термина, а затем, если поисковый термин найден в столбце содержимого, также отображать каждый фрагмент. Как это:
Search term "virus":
Category: Coughing
ID: Coughing Symptoms
Snippet 1: "the common cold, which is spread by the cold <b>virus</b> blah blah etc"
Snippet 2: "lorem ipsum some other things <b>virus</b> and then some other stuff"
Category: Coughing
ID: Coughing treatment
Snippet 1: "...coughing can be treated by managing the symptoms. If a <b>virus</b> blah etc"
Category: Headache
ID: Headache Symptoms
Snippet: "I think you get the idea now <b>virus</b> more things"
Я могу получить результаты поиска строки и фрагменты как отдельные функции прямо сейчас. Это выполняет поиск в таблице и правильно выводит row.elements:
function SearchValueInDB() {
db.transaction(function(transaction) {
var search = $('#txSearch').val(),
query = "SELECT * FROM guidelines WHERE guidelines MATCH '" + search + "*';";
transaction.executeSql(query,[], function(transaction, result) {
if (result != null && result.rows != null) {
if (result.rows.length == 0) {
//no results message
} else {
for (var i = 0; i < result.rows.length; i++) {
var row = result.rows.item(i);
$('#lbResult').append('<br/> Search result:' + row.category + ' ' + row.id + ' ' + row.header + '<br/>');
}
}
}
},nullHandler,errorHandler);
});
}
Это ищет фрагменты в content
столбец, и распечатывает их список:
function SearchForSnippet() {
db.transaction(function(transaction) {
var search = $('#txSearch').val(),
query = "SELECT snippet(guidelines) FROM guidelines WHERE content MATCH '" + search + "*';";
transaction.executeSql(query,[], function(transaction, result) {
if (result != null && result.rows != null) {
$('#lbResult').html('');
for (var i = 0; i < result.rows.length; i++) {
var row = result.rows.item(i);
for(var key in row) {
var value = row[key];
$('#lbResult').append('<br/> ' + i + value );
}
}
}
},nullHandler,errorHandler);
});
}
До сих пор я могу представить два возможных подхода к этому: либо я могу каким-либо образом комбинировать запросы SELECT, хотя я не могу найти примеры запросов JOINing с использованием функции snippet(). Или я могу создать новую функцию findSnippet()
и вызывать его после каждой итерации result.rows
массив. Один из этих подходов может сработать, или есть лучший способ справиться с этим?
1 ответ
Просто перечислите все столбцы результата, которые вы хотите получить для каждой соответствующей записи:
SELECT category,
id,
header,
snippet(guidelines) AS snip
FROM guidelines
WHERE content MATCH 'snail*'