我有一个名为RecyclerView
的MySQL表,其中包含来自世界各地的位置。
我在此表上设置了一个SPHINX索引,将以下内容写入Fragment
文件:
Adapter
对sql_query的解释:列Context
包含位置的确切名称(即:巴黎,罗马,纽约),Locations
列,包含每个该位置的替代名称(即:不同语言的位置名称,例如,布加勒斯特,替代名称可以包含Bukarest)
奇怪的是,如果我从
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 }
,当我尝试运行索引器时,它会遇到一个错误,即geonameid_attr无法找到,并且它被忽略。为什么会这样?
为了测试一切正常,我从命令行连接到SphinxSQL,并尝试以下列方式运行一些查询:
Locations.Name
我从上述查询中得到的是,它会搜索Locations.AlternateNames
列和Locations.LocationId
列,并返回所有正确 [query-string-here] < / em>,或者其中包含 [query-string-here] 。
但是如果我运行上面的查询,搜索例如: Paris ,它会返回一些行(正确的行,因为我已经用MySQL检查了它),但是如果我搜索 Pari ,它什么都不返回。
因为字符串 Pari 显然是字符串 Paris 的一部分,所以除了狮身人面像搜索返回的结果至少与我在搜索时返回的结果相同巴黎。
我在哪里做错了什么?我查询
sql_query
的方式是否存在问题,我的设置中是否有错误,而且我的数据索引错误了?
答案 0 :(得分:1)
第一列始终用作文档ID,因此如果删除它,则别名将用作文档ID。让它不适用于属性。
无论如何,您无需将唯一ID复制为属性。只需直接使用'id'就可以在任何地方使用attribe select id from...
至于匹配。 Sphinx旨在匹配整个单词。
如果想要部分单词匹配,请查看min_prefix_len
或中缀。
建议坚持使用enable_star = 1,如果不想包含星号,请参阅expand_keywords。