我有一个需要搜索的关键字列表,使用 ThinkingSphinx 其中一些比其他更重要,我需要找到一种方法来加权这些词。
到目前为止,我想出的唯一解决方案是在我的查询中重复 x 次相同的单词以增加其相关性。例如:
3 个关键字,每个关键字都有一个重要级别:蓝色(1)最近(2)有趣(3)我运行这个查询
MyModel.search "Blue 最近的趣趣趣趣", :match_mode => :any
不是很优雅,而且非常有限。有没有人有更好的主意?
我有一个需要搜索的关键字列表,使用 ThinkingSphinx 其中一些比其他更重要,我需要找到一种方法来加权这些词。
到目前为止,我想出的唯一解决方案是在我的查询中重复 x 次相同的单词以增加其相关性。例如:
3 个关键字,每个关键字都有一个重要级别:蓝色(1)最近(2)有趣(3)我运行这个查询
MyModel.search "Blue 最近的趣趣趣趣", :match_mode => :any
不是很优雅,而且非常有限。有没有人有更好的主意?
最近我一直在广泛使用 Sphinx,自从 UltraSphinx 死后,我开始使用 Pat 的伟大插件(谢谢 Pat,我很快就会在墨尔本给你买杯咖啡!)
根据您的原始想法,我看到了一个可能的解决方案,但是您需要在“索引时间”而不是“运行时间”对数据进行更改。
尝试这个:
修改您的 Sphinx SQL 查询,将“Blue”替换为“Blue Blue Blue Blue”,将“Recent”替换为“Recent Recent Recent”,将“Fun”替换为“Fun Fun”。这将放大您的特殊关键字的任何出现。
例如 SELECT REPLACE(my_text_col,"blue","blue blue blue") as my_text_col ...
您可能想一次完成所有操作,因此只需嵌套替换调用。
例如 SELECT REPLACE(REPLACE(my_text_col,"fun","fun fun"),"blue","blue blue blue") as my_text_col ...
接下来,将您的排名模式更改为 SPH_RANK_WORDCOUNT。这种方式最大的相关性被赋予关键字的频率。
(可选)假设您有一个与您的特殊关键字相关的关键字列表。例如,“淡蓝色”与“蓝色”相关,“愉快”与“有趣”相关。在运行时,改写查询文本以查找目标词。您可以轻松地将这些单词存储在哈希中,然后循环遍历它以进行替换。
# Add trigger words as the key,
# and the related special keyword as the value
trigger_words = {}
trigger_words['pale blue'] = 'blue'
trigger_words['pleasant'] = 'fun'
# Now loop through each query term and see if it should be replaced
new_query = ""
query.split.each do |word|
word = trigger_words[word] if trigger_words.has_key?(word)
new_query = new_query + ' ' word
end
现在你也有了准关键字聚类。Sphinx 真的是一项了不起的技术,享受吧!
如果您可以将这些关键字放入单独的字段中,那么您可以对这些字段进行加权以使其更重要。不过,这是我能想到的唯一好方法。
MyModel.search "Blue Recent Fun", :field_weights => {"keywords" => 100}