0

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

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

或者接近它。

4

1 回答 1

0

您正在尝试做的事情有很多活动部分,但我至少可以回答它的标题部分。Sphinx 提供了字段级别的排名因素,让您可以自定义 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”的新字段,然后向索引添加一个数字属性以显示一个单词已被删除(您可以在排名表达式中使用数字属性)。

至于“Bt”的排名高于“Bat”,我不确定这是否可能不以某种方式改变 Sphinx 的字母顺序概念。你可以尝试深入研究源代码吗?;)


最后一点。对于这种特殊类型的查询,MySQL(我说 MySQL,因为它是获取 Sphinx 索引的常用方法)实际上也可以正常工作。如果您去掉前导的“The”,如果您确定只想要查询与字段开头匹配的结果,那么 B-tree 索引(MySQL 使用)是一种非常好的搜索方式。Sphinx 的倒排索引对于这类事情来说有点矫枉过正。

于 2014-08-27T22:12:52.750 回答