【问题标题】:Sphinx returning only exact matches狮身人面像只返回完全匹配
【发布时间】:2015-12-22 15:17:06
【问题描述】:

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

我已经在这个表上设置了一个 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 列包含该位置的每个备用名称位置(即:不同语言的位置名称,例如,对于布加勒斯特,备用名称可以包含布加勒斯特)

奇怪的是,如果我从sql_query 中省略了第一个Locations.LocationId,当我尝试运行索引器时,它会向我显示一个错误,即找不到geonameid_attr,并且它被忽略了。为什么会这样?

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

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

我在上述查询中的例外是,它会同时搜索alternatenames 列和name 列,并返回完全符合[query-string-here]的所有内容,或者里面有 [query-string-here].

但是如果我运行上面的查询,例如搜索:Paris,它会返回一些行(正确的行,因为我已经用 MySQL 检查过),但是如果我搜索 Pari,它什么也不返回。

由于字符串 Pari 显然是字符串 Paris 的一部分,因此我希望 sphinx 搜索返回的结果至少与我搜索时返回的结果相同巴黎

我在哪里做错了什么?我查询Sphinx 的方式是否有问题,我的设置是否有错误,我的数据索引错误?

【问题讨论】:

    标签: mysql sphinx


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,这就是问题所在,谢谢,我认为 sphinx 会自动进行 MySQL LIKE 搜索,但我需要设置 min_prefix_len,并使用 *。谢谢
    猜你喜欢
    • 2011-07-13
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多