Sphinx 只返回完全匹配

Sphinx returning only exact matches

我有一个 MySQL table,名为 Locations,其中包含来自世界各地的位置。

我已经在此 table 上设置了 SPHINX 索引,将以下内容写入我的 sphinx.conf 文件:

source src_geonames
{
    type                    = mysql

    sql_host                = localhost
    sql_user                = myuser_myuser
    sql_pass                = mypass_mypass
    sql_db                  = mydb_mydb
    sql_port                = port

    sql_query_pre           = SET NAMES utf8
    sql_query_pre           = SET session wait_timeout=7200
    sql_query_pre           = SET session net_read_timeout=7200
    sql_query_pre           = SET session net_write_timeout=7200

    sql_query               = SELECT Locations.LocationId, Locations.LocationId AS geonameid_attr, Locations.Name AS name, Locations.AsciiName AS asciiname, Locations.AlternateNames AS alternatenames, Locations.countries_CountryId AS country FROM Locations WHERE Locations.FCode IN ('PPL', 'PPLA', 'PPLA2', 'PPLA3', 'PPLA4', 'PPLC', 'PPLCH', 'PPLF', 'PPLG', 'PPLH', 'PPLL', 'PPLQ', 'PPLR', 'PPLS', 'PPLW', 'PPLX', 'STLMT') OR Locations.FCode LIKE 'ADM%'

    sql_attr_uint           = geonameid_attr
    sql_field_string        = country
}


index geonames
{
    source                  = src_geonames
    path                    = /server06-disk4/sphinx_data/geonames
    charset_table           = 0..9, A..Z->a..z, _, a..z, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF
    mlock                   = 1
}

对 sql_query 的解释:Locations.Name 包含位置的确切名称(即:巴黎、罗马、纽约), Locations.AlternateNames 列,包含该位置的每个备用名称(即:不同语言的位置名称,例如,对于布加勒斯特,备用名称可以包含布加勒斯特)

Strangely, if I ommit the first Locations.LocationId from the sql_query, when I try to run indexer, it greets me with an error, that geonameid_attr can't be found, and it is being ignored. Why is this happening?

为了测试一切正常,我从命令行连接到 SphinxSQL,并尝试 运行 一些查询,方法如下:

SELECT geonameid_attr FROM geonames WHERE match('@(name,alternatenames) "[query-string-here]"') LIMIT 0,10 option max_matches=200000

我从上面的查询中排除的是,它会搜索 alternatenames 列和 name 列,以及 return 完全是 的所有内容[query-string-here],或者里面有 [query-string-here].

但是如果我 运行 上面的查询,搜索例如:Paris,它 returns 一些行(正确的行,因为我已经用 MySQL) 检查过它,但如果我搜索 Pari,它 return 什么都没有。

因为字符串 Pari 显然是字符串 Paris 的一部分,所以除了 sphinx 搜索 return如果我正在搜索 Paris.

,至少会得到与 returns 相同的结果

Where am I doing something wrong? Is there a problem in the way I am querying Sphinx, is there an error in my setup, and I am indexing my data wrong?

第一列始终用作文档 ID,因此如果删除它,则别名将用作文档 ID。让它不能用于属性。

无论如何您都不需要将唯一 ID 复制为属性。直接使用 'id' 它几乎可以在任何地方使用属性 select id from...

至于匹配。 Sphinx 旨在匹配整个单词。

如果要部分词匹配,看min_prefix_len或中缀。

建议坚持使用 enable_star =1,如果不想包含星星,请参阅 expand_keywords。