【问题标题】:Sphinx match by first letter狮身人面像匹配首字母
【发布时间】:2014-05-20 22:30:10
【问题描述】:

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

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

或接近它。

【问题讨论】:

  • 您的数据库中真的有一个名为artistname 的列和一个名为artist_name 的列吗?也许它们包含不同的信息?还有你的 min_prefix_len、min_infix_len、min_word_len、enable_star 和 dict 设置是什么?
  • 源查询实际上是几个连接,而且很大。我只是针对这种情况进行了简化,而忽略了字段名称。需要注意的 2 个字段是艺术家名和艺术家名_init,其余的与我的情况无关。 artistname 保存艺术家姓名,init 字段保存名称的前 3 个字母,如果存在,则删除“The”。我将使用请求的信息更新问题。

标签: mysql sphinx sphinxql


【解决方案1】:

在您尝试做的事情中有很多活动部分,但我至少可以回答它的标题部分。 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”的排名高于“Bat”,我不确定在不改变 Sphinx 的字母顺序概念的情况下这是否可能。你可以尝试深入研究源代码吗? ;)


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

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多