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。
我有一个 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 thesql_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。