Использование Match в запросе sqlite fts5, но вам нужно больше контроля над рейтингом?
У меня есть виртуальная таблица, созданная с помощью fts5:
import sqlite3
# create a db in memory
con = sqlite3.connect(':memory:')
con.execute('create virtual table operators using fts5(family, operator, label, summary, tokenize=porter)')
# some sample data
samples = {'insideTOP':
{'label':'Inside',
'family':'TOP',
'summary':'The Inside TOP places Input1 inside Input2.'
},
'inTOP':
{'label':'In',
'family':'TOP',
'summary':'The In TOP is used to create a TOP input.'
},
'fileinSOP':
{'label':'File In',
'family':'SOP',
'summary':'The File In SOP allows you to read a file'
}
}
# fill db with those values
for operator in samples.keys():
opDescr = samples[operator]
con.executescript("insert into operators (family, operator, label, summary) values ('{0}','{1}','{2}','{3}');".format(opDescr['family'],operator,opDescr['label'],opDescr['summary']))
со следующими колонками
+--------+-----------+------------+----------------------------------------------+
| family | operator | label | summary |
+--------+-----------+------------+----------------------------------------------+
| TOP | insideTOP | Inside | The Inside TOP places Input1 inside Input2.|
| TOP | inTOP | In | The In TOP is used to create a TOP input. |
| SOP | fileinSOP | File In | The File In SOP allows you to read a file |
+--------+-----------+------------+----------------------------------------------+
пример запроса:
# query the db
query = "select operator from operators where operators match 'operator:In*' or operators match 'label:In*' order by family, bm25(operators)"
result = con.execute(query)
for row in result:
print(row)
И в результате я получаю
- fileinSOP
- insideTOP
- INTOP
Однако для этого конкретного случая я бы хотел, чтобы "inTOP" появлялся перед "insideTOP", поскольку метка идеально подходит.
Что было бы хорошим методом, чтобы можно было массировать эти результаты так, как мне бы хотелось?
большое спасибо
Markus
0 ответов
Может быть, вы можете указать свое правило порядка в вопросе.
Если вы используете bm25 для упорядочивания результатов, вы не можете достичь желаемого результата. Я предлагаю вам использовать свою настраиваемую функцию ранжирования, как показано ниже sql:
query = "select operator from operators where operators match 'operator:In*' or operators match 'label:In*' order by myrank(family, operators)"
Определить пользовательскую функцию ранжирования в fts5 очень просто, вы можете следовать инструкциям на веб-сайте fts5.
Если вы также хотите получить результат bm25 в качестве рейтингового балла, вы можете получить его с помощью метода определения рейтинга, который может рассчитать ваш окончательный балл.