狮身人面像匹配第一个字母

时间:2014-05-20 22:30:10

标签: mysql sphinx sphinxql

我需要简单解释为什么我的查询无法带来我需要的结果。

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 ")

或接近它。

1 个答案:

答案 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使用的)是一种非常好的搜索方式,如果你确定你只想要查询匹配字段开头的结果。斯芬克斯的倒排索引对于那种事情来说有点过分。