我需要简单解释为什么我的查询无法带来我需要的结果。
Sphinx 2.0.8-id64-release(r3831) 这是我在sphinx.conf中所拥有的:
SELECT
trackid,
title,
artistname,
SUBSTRING(REPLACE(TRIM(`artist_name`), 'the ', ''),1,3) AS artistname_init
....
sql_field_string = title
sql_field_string = artistname
sql_field_string = artistname_init
其他设置:
docinfo = extern
charset_type = utf-8
min_prefix_len = 1
enable_star = 1
expand_keywords= 0
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z
查询有效。我没有问题地索引我的数据。然而,我没有让狮身人面像带来任何明智的结果。我正在使用SphinxQL进行查询。
示例:
select
artistname, artistname_init from myindex
WHERE MATCH('@artistname_init ^t*')
GROUP BY artistname ORDER BY artistname_init ASC limit 0,10;
不会带来与查询相关的任何内容。 我已经尝试过我能想到的一切:
MATCH('@artistname_init ^t*')
MATCH('@artistname_init[1] t')
MATCH('@artistname_init ^t$')
任何人都可以指出我的错误在哪里,也许可以给我一些适合我案件的查询? 我的目标是获得遵循此排序顺序的结果:
B (Single letter)
B-T (Single letter + non-alphabet sign after)
B as Blue (Single letter + space after)
Baccara (First letter of single word)
Bad Religion (First letter of several words)
The B (not counting "The ")
The B.Y.Z (Single letter + non-alphabet sign after not counting "The ")
The B 2 B (Single letter + space after not counting "The ")
The Boyzz (First letter of single word not counting "The ")
The Blue Boy (First letter of several words not counting "The ")
或接近它。
答案 0 :(得分:0)
你要做的事情中有很多活动部分,但我至少可以回答它的标题部分。 Sphinx提供field-level ranking factors来让你自定义WEIGHT()函数 - 按照你想要的方式排序匹配要容易得多,而不是试图在第一个或第二个字之后实际过滤出与查询匹配的条目
这是一个示例,它将返回所有带有以“b”开头的单词的结果,并按该单词的出现时间排序:
SELECT id, artistname, WEIGHT()
FROM myindex
WHERE MATCH('(@artistname (b*))')
ORDER BY WEIGHT() DESC
LIMIT 10
OPTION ranker=expr('sum(100 - min_hit_pos)');
如果你想过滤掉其他情况,比如“其他几个字然后B”,我想我建议你在你的应用程序中这样做。例如,如果第四个结果在第3个单词中包含关键字,则仅返回前3个结果。那,或者实际上在Sphinx 中创建一个新字段而没有前导“The”,然后在索引中添加一个数字属性以显示一个单词被删除(你可以在你的排名表达式中使用数字属性) )。
至于排名“B-t”比“蝙蝠”更高,我不确定这是否可能不会以某种方式改变Sphinx的字母顺序概念..您可以尝试潜入源代码? ;)
最后一点。对于这种特殊类型的查询,MySQL(我说MySQL因为它是采购Sphinx索引的常用方式)实际上也可以正常工作。如果你去掉前导“The”,那么B树索引(MySQL使用的)是一种非常好的搜索方式,如果你确定你只想要查询匹配字段开头的结果。斯芬克斯的倒排索引对于那种事情来说有点过分。