Search SQLite全文搜索相关性排名

Search SQLite全文搜索相关性排名,search,sqlite,indexing,full-text-search,Search,Sqlite,Indexing,Full Text Search,我正在使用sqlite3的fts4扩展来支持全文索引和文本数据搜索。这很有效,但我注意到结果根本没有相关性。我想我太习惯Lucene了。我已经看到一些使用matchinfo()结果编写自定义rank方法的简短建议,但我不清楚这是如何实现的,也不清楚是否有任何复杂的示例。其他人是如何处理的?文档中有一个完整的示例。您需要做更多的工作来获得一个良好的相关性排名,因为提供的函数仅适用于入门。例如,使用matchinfo(表,'pcnalx')有足够的信息来实现 下面是的一个实现。将其与处的建议结合使用

我正在使用sqlite3的fts4扩展来支持全文索引和文本数据搜索。这很有效,但我注意到结果根本没有相关性。我想我太习惯Lucene了。我已经看到一些使用matchinfo()结果编写自定义rank方法的简短建议,但我不清楚这是如何实现的,也不清楚是否有任何复杂的示例。其他人是如何处理的?

文档中有一个完整的示例。您需要做更多的工作来获得一个良好的相关性排名,因为提供的函数仅适用于入门。例如,使用
matchinfo(表,'pcnalx')
有足够的信息来实现

下面是的一个实现。将其与处的建议结合使用将帮助您生成相关性排名匹配查询。这是在VB.Net中编写的,使用
System.Data.SQLite
函数调用查询。只要使用
System.Data.SQLite
函数调用SQL代码,就可以从SQL代码中调用末尾的自定义
SQLite函数

公共类匹配信息
属性matchablePhrases为整数
属性userDefinedColumns为整数
属性totalDocuments为整数
Private _int32hitdataas List(整型)
Private _longestSubsequencePhraseMatches作为新列表(整数)
Private _tokensInDocument作为新列表(整数)
Private _averageTokensInDocument作为新列表(整数)
Private\u max\u以整数形式命中该行?
公共只读属性max\u以整数形式命中\u此\u行
得到
如果马克斯击中了这一行,那就什么都不是了
_此行的最大点击次数=0
对于p=0的匹配短语-1
对于c=0到userDefinedColumns-1
Dim myHitsThisRow As Integer=点击该行(p,c)
如果myHitsThisRow>\u max\u点击了这一行,那么
_max\u hits\u this\u row=myhits this row
如果结束
下一个
下一个
如果结束
Return\u max\u点击该行
结束
端属性
Private\u max\u将所有行作为整数命中?
公共只读属性max\u将所有行作为整数命中
得到
如果“最大值”点击“所有行”则为空
_最大点击量所有行=0
对于p=0的匹配短语-1
对于c=0到userDefinedColumns-1
Dim myHitsAllRows As Integer=点击所有行(p,c)
如果myHitsAllRows>\u max\u点击了\u所有\u行,则
_最大命中率\u所有行=myHitsAllRows
如果结束
下一个
下一个
如果结束
返回\u最大\u点击所有\u行
结束
端属性
Private\u max\u docs\u,点击次数为整数?
公共只读属性max\u docs\u,点击次数为整数
得到
如果max docs和hits都不算什么
_点击次数为0的最大文档数
对于p=0的匹配短语-1
对于c=0到userDefinedColumns-1
Dim myDocsWithHits As Integer=带有点击次数的文档(p,c)
如果myDocsWithHits>\u max\u docs\u与\u hits
_最大文档点击次数=myDocsWithHits
如果结束
下一个
下一个
如果结束
返回_max_docs_和_hits
结束
端属性
二等兵(bm25)是双等兵吗??
公共只读属性BM25Rank为双精度
得到
如果_BM25Rank什么都不是,那么
_BM25Rank=0
'计算BM25等级
'http://en.wikipedia.org/wiki/Okapi_BM25
'k1,校准文件术语频率缩放。将k1设为0对应于二元模型-无术语频率。增加k1会给稀有单词带来更多的刺激。
'b,按文档长度校准缩放比例,并可以取0到1之间的值,其中0表示没有长度标准化,1对应于按文档长度完全缩放术语权重。
尺寸k1为双精度=1.2
尺寸b为双精度=0.75
对于列=0到userDefinedColumns-1
对于短语=0到可匹配短语-1
Dim IDF As Double=Math.Log((totalDocuments-点击所有行(短语,列)+0.5)/(点击所有行(短语,列)+0.5))
Dim分数为Double=(IDF*((点击该行(短语,列)*(k1+1))/(点击该行(短语,列)+k1*(1-b+b*)\TokensDocument(列)/\U AverageTokensDocument(列щ))
如果得分<0,则
分数=0
如果结束
_BM25Rank+=分数
下一个
下一个
如果结束
返回_BM25Rank
结束
端属性
Public Sub New(原始pcnalsx匹配信息为Byte())
Dim int32_pcsx_MatchInfo作为新列表(整数)
对于i=0的原始\u pcnalsx\u MatchInfo.Length-1步骤4
int32_pcsx_MatchInfo.Add(BitConverter.ToUInt32(原始pcnalsx_MatchInfo,i))
下一个
'获取原始数据并将其解析出来
Me.matchablesphrases=int32\u pcsx\u MatchInfo(0)
int32_pcsx_MatchInfo.RemoveAt(0)
Me.userDefinedColumns=int32\u pcsx\u MatchInfo(0)
我
SELECT * FROM email WHERE email MATCH 'fts5' ORDER BY rank;