sqlite полнотекстовый поиск sqlite прерывается, когда на входе есть da sh - PullRequest
0 голосов
/ 18 января 2020

У меня есть форма с панелью поиска в моем веб-приложении.

@app.route('/search', methods=['POST','GET'])
def row_search():
    if request.method == 'POST':
        result = request.form
        print(result['search'])
        cursor.execute("""SELECT rowid,projeYili,projeAdi,ogretmenler,ogrenciler 
                    FROM projects
                    WHERE projects MATCH '{}'
                    """.format(result['search']))
    return render_template('index.html', projects=cursor.fetchall())

Я использовал MATCH для поиска в таблице именованных проектов, но если я ввожу специальные символы (?, - ,.) в моей строке поиска я получаю ошибку

, например, если я ввожу 2018-2019 в моей строке поиска, я получаю эту ошибку sqlite3.OperationalError: no such column: 2019 код отлично работает с текстом без специальных символов

1 Ответ

0 голосов
/ 19 января 2020

В фильтре столбцов , da sh означает НЕ смотреть на следующие столбцы. Возможно, что то, что вы вводите как поисковый запрос, анализируется так, что -2019 считается фильтром столбца. Я не уверен, как это происходит, если фильтры столбцов помечены двоеточием, но это объясняет сообщение об ошибке. Я могу воспроизвести его, постараюсь в дальнейшем разобраться.

Однако вы можете искать фразу из нескольких слов, заключив ее в двойные кавычки, поэтому "2018-2019" и "2018 2019" оба совпадают (настройки токенизатора по умолчанию используют da sh в качестве разделителя слов). Однако поиск 2018 2019 будет сопоставлять что-либо с обоими словами, независимо от того, где они появляются, а не только рядом.

Примеры:

sqlite> CREATE VIRTUAL TABLE test USING fts5(body);
sqlite> INSERT INTO test VALUES ('in the years 2018-2019 something happened.');
sqlite> INSERT INTO test VALUES ('It was 2018 and then it was 2019');
sqlite> SELECT * FROM test WHERE test MATCH '2018-2019';
Error: no such column: 2019
sqlite> SELECT * FROM test WHERE test MATCH '"2018-2019"';
body                                      
------------------------------------------
in the years 2018-2019 something happened.
sqlite> SELECT * FROM test WHERE test MATCH '"2018 2019"';
body                                      
------------------------------------------
in the years 2018-2019 something happened.
sqlite> SELECT * FROM test WHERE test MATCH '2018 2019';
body                                      
------------------------------------------
in the years 2018-2019 something happened.
It was 2018 and then it was 2019          

Подробнее о синаксе запроса см. В разделе документация .

...