【发布时间】: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的方式是否有问题,我的设置是否有错误,我的数据索引错误?
【问题讨论】: