Использование Match в запросе sqlite fts5, но вам нужно больше контроля над рейтингом? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть виртуальная таблица, созданная с использованием 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 ', поскольку метка идеально подходит.

Какая была бы хорошая техника, чтобы можно было поменять эти результаты так, как мне бы хотелось?

Спасиботы очень

Маркус

1 Ответ

0 голосов
/ 20 марта 2019

возможно, вы можете поставить правило вопроса в вопросе.

Если вы используете 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 был оценен как ранг., вы можете получить оценку в методе ранга можно рассчитать ваш окончательный счет.

...